diff --git a/ChangeLog b/ChangeLog index d3f15ca7059d..5dc0ed087e98 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2026-09-25 Dominic P + + * MAINTAINERS.yml: Add myself. + * MAINTAINERS: Regenerate. + +2026-09-19 Michiel Derhaeg + + * MAINTAINERS: Regenerate. + * MAINTAINERS.yml: Add myself. + 2026-09-10 Rohith Kapelli * MAINTAINERS.yml: Add myself to Write After Approval and DCO. diff --git a/MAINTAINERS b/MAINTAINERS index 51c5eb206514..44e8b1f84954 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -465,6 +465,7 @@ Bud Davis bdavis Jerry DeLisle jvdelisle DJ Delorie dj Chris Demetriou cgd +Michiel Derhaeg michiel Sameera Deshpande sameerad Wilco Dijkstra wilco Dimitar Dimitrov dimitar @@ -753,6 +754,7 @@ Alexandre Oliva aoliva Andrea Ornstein andreao Rainer Orth ro Maxim Ostapenko chefmax +Dominic P dominicp Jeevitha Palanisamy jeevitha Patrick Palka ppalka Seongbae Park spark @@ -1023,6 +1025,7 @@ Gaius Mulley Shreya Munnangi Shreya Munnangi Szabolcs Nagy +Dominic P Pierre-Emmanuel Patry Pierre-Emmanuel Patry Mikael Pettersson diff --git a/MAINTAINERS.yml b/MAINTAINERS.yml index 8fd8456ea967..a5ab2f11b61a 100644 --- a/MAINTAINERS.yml +++ b/MAINTAINERS.yml @@ -1337,6 +1337,17 @@ users: inactive: true inactive_email: - jdennett@google.com +- sn: Derhaeg + cn: Michiel Derhaeg + email: + - michiel.derhaeg@globalfoundries.com + - michiel@derhaeg.be + - michiel@gcc.gnu.org + roles: + - WriteAfter + account: michiel + inactive_email: + - michiel@synopsys.com - sn: Deshpande cn: Sameera Deshpande email: @@ -4543,6 +4554,15 @@ users: - WriteAfter account: chefmax inactive: true +- sn: P + cn: Dominic P + email: + - gcc@gcc.dp11.uk + roles: + - WriteAfter + account: dominicp + DCO: + - gcc@gcc.dp11.uk - sn: Palanisamy cn: Jeevitha Palanisamy email: diff --git a/contrib/ChangeLog b/contrib/ChangeLog index 6c85f6f49773..59d6c14f1b82 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,22 @@ +2026-09-18 Jakub Jelinek + + * unicode/README: Replace Unicode 17 version with 18. + * unicode/gen_libstdcxx_unicode_data.py: Use 180000 instead of + 160000 in _GLIBCXX_GET_UNICODE_DATA test. + * unicode/DerivedCoreProperties.txt: Updated from Unicode 18.0. + * unicode/emoji-data.txt: Likewise. + * unicode/PropList.txt: Likewise. + * unicode/HangulSyllableType.txt: Likewise. + * unicode/DerivedNormalizationProps.txt: Likewise. + * unicode/NameAliases.txt: Likewise. + * unicode/UnicodeData.txt: Likewise. + * unicode/EastAsianWidth.txt: Likewise. + +2026-09-15 Kyrylo Tkachov + + * filter-clang-warnings.py (skip_warning): Match numbered attribute + files. + 2026-09-11 Richard Biener * gcc-changelog/git_update_version.py: Remove gcc-13 branch diff --git a/contrib/filter-clang-warnings.py b/contrib/filter-clang-warnings.py index 9de005990b52..ba2fa532f825 100755 --- a/contrib/filter-clang-warnings.py +++ b/contrib/filter-clang-warnings.py @@ -56,7 +56,7 @@ def skip_warning(filename, message): 'ipa-strub.cc': ['-Wunused-but-set-variable'], 'insn-modes.cc': ['-Wshift-count-overflow'], 'insn-emit': ['-Wtautological-compare'], - 'insn-attrtab.cc': ['-Wparentheses-equality'], + 'insn-attrtab': ['-Wparentheses-equality'], 'omp-builtins.def': ['-Wc++11-narrowing'], 'wide-int.h': ['-Wnontrivial-memcall'], 'i386.md': ['-Wparentheses-equality', '-Wtautological-compare', diff --git a/contrib/unicode/DerivedCoreProperties.txt b/contrib/unicode/DerivedCoreProperties.txt index f327784bf395..a41de001b7e2 100644 --- a/contrib/unicode/DerivedCoreProperties.txt +++ b/contrib/unicode/DerivedCoreProperties.txt @@ -1,6 +1,6 @@ -# DerivedCoreProperties-17.0.0.txt -# Date: 2025-07-30, 23:55:08 GMT -# © 2025 Unicode®, Inc. +# DerivedCoreProperties-18.0.0.txt +# Date: 2026-08-07, 16:19:42 GMT +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # @@ -178,7 +178,8 @@ FF5E ; Math # Sm FULLWIDTH TILDE FFE2 ; Math # Sm FULLWIDTH NOT SIGN FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW 10D8E..10D8F ; Math # Sm [2] GARAY PLUS SIGN..GARAY MINUS SIGN -1CEF0 ; Math # Sm MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR +1CEDD..1CEDF ; Math # Sm [3] SQUARE ROOT OF SQUARE ROOT..SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT +1CEF0..1CEFD ; Math # Sm [14] MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR..HYPERBOLA 1D400..1D454 ; Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G 1D456..1D49C ; Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A 1D49E..1D49F ; Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D @@ -197,7 +198,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A 1D540..1D544 ; Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; Math # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C1 ; Math # Sm MATHEMATICAL BOLD NABLA 1D6C2..1D6DA ; Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA @@ -220,6 +221,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A 1D7C3 ; Math # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4..1D7CB ; Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1DB00..1DB1C ; Math # Sm [29] LEIBNIZIAN EQUALS SIGN..FACIT SYMBOL 1EE00..1EE03 ; Math # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; Math # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; Math # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -254,9 +256,11 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A 1EEA5..1EEA9 ; Math # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Math # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F7DB ; Math # So BULLET IN DOUBLE CIRCLE +1F7F1..1F7FF ; Math # So [15] CIRCLE WITH DOUBLE VERTICAL AND HORIZONTAL LINE..RHOMBUS 1F8D0..1F8D8 ; Math # Sm [9] LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW..LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE -# Total code points: 2322 +# Total code points: 2384 # ================================================ @@ -298,13 +302,14 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A 03F7..0481 ; Alphabetic # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA 048A..052F ; Alphabetic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; Alphabetic # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; Alphabetic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; Alphabetic # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 0560..0588 ; Alphabetic # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; Alphabetic # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 05B0..05BD ; Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG 05BF ; Alphabetic # Mn HEBREW POINT RAFE 05C1..05C2 ; Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Alphabetic # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; Alphabetic # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 05D0..05EA ; Alphabetic # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; Alphabetic # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 0610..061A ; Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA @@ -750,7 +755,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS A 1FF6..1FFC ; Alphabetic # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI 2071 ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; Alphabetic # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Alphabetic # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; Alphabetic # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 2102 ; Alphabetic # L& DOUBLE-STRUCK CAPITAL C 2107 ; Alphabetic # L& EULER CONSTANT 210A..2113 ; Alphabetic # L& [10] SCRIPT SMALL G..SCRIPT SMALL L @@ -835,7 +840,8 @@ A771..A787 ; Alphabetic # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER A788 ; Alphabetic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; Alphabetic # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; Alphabetic # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; Alphabetic # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; Alphabetic # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Alphabetic # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; Alphabetic # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; Alphabetic # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; Alphabetic # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -925,6 +931,7 @@ AB30..AB5A ; Alphabetic # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMA AB5C..AB5F ; Alphabetic # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; Alphabetic # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; Alphabetic # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; Alphabetic # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; Alphabetic # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; Alphabetic # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM ABE3..ABE4 ; Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP @@ -1006,7 +1013,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 10760..10767 ; Alphabetic # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; Alphabetic # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Alphabetic # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; Alphabetic # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; Alphabetic # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; Alphabetic # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; Alphabetic # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; Alphabetic # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -1055,6 +1062,11 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 10EC2..10EC4 ; Alphabetic # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; Alphabetic # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; Alphabetic # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW +10ECB..10ECD ; Alphabetic # Mn [3] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC SOUTHWEST POINTING ARROWHEAD BELOW +10ED9..10EEE ; Alphabetic # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH +10EF3 ; Alphabetic # Mn ARABIC SMALL HIGH NOON WITH FATHA +10EF5 ; Alphabetic # Mn ARABIC SMALL HIGH NOON WITH DAMMA +10EF7..10EF8 ; Alphabetic # Mn [2] ARABIC SMALL HIGH HEH INITIAL FORM..ARABIC SMALL HIGH WORD KABBIR 10EFA..10EFC ; Alphabetic # Mn [3] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC COMBINING ALEF OVERLAY 10F00..10F1C ; Alphabetic # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; Alphabetic # Lo OLD SOGDIAN LIGATURE AYIN-DALETH @@ -1241,6 +1253,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 11A97 ; Alphabetic # Mc SOYOMBO SIGN VISARGA 11A9D ; Alphabetic # Lo SOYOMBO MARK PLUTA 11AB0..11AF8 ; Alphabetic # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B0A ; Alphabetic # Lo DEVANAGARI LETTER ALTERNATE DDDA 11B60 ; Alphabetic # Mn SHARADA VOWEL SIGN OE 11B61 ; Alphabetic # Mc SHARADA VOWEL SIGN OOE 11B62..11B64 ; Alphabetic # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E @@ -1285,6 +1298,8 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 11DB0..11DD8 ; Alphabetic # Lo [41] TOLONG SIKI LETTER I..TOLONG SIKI LETTER RRH 11DD9 ; Alphabetic # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; Alphabetic # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA +11DF0 ; Alphabetic # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE +11DF1 ; Alphabetic # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; Alphabetic # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O @@ -1299,8 +1314,10 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 11F40 ; Alphabetic # Mn KAWI VOWEL SIGN EU 11FB0 ; Alphabetic # Lo LISU LETTER YHA 12000..12399 ; Alphabetic # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; Alphabetic # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; Alphabetic # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU +12475..1247F ; Alphabetic # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; Alphabetic # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; Alphabetic # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; Alphabetic # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342F ; Alphabetic # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D 13441..13446 ; Alphabetic # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN @@ -1335,17 +1352,19 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 16FF0..16FF1 ; Alphabetic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 16FF2..16FF3 ; Alphabetic # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; Alphabetic # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; Alphabetic # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; Alphabetic # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; Alphabetic # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; Alphabetic # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; Alphabetic # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; Alphabetic # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; Alphabetic # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; Alphabetic # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; Alphabetic # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; Alphabetic # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B122 ; Alphabetic # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B000..1B128 ; Alphabetic # Lo [297] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ALTERNATE WI 1B132 ; Alphabetic # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; Alphabetic # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; Alphabetic # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; Alphabetic # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; Alphabetic # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; Alphabetic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; Alphabetic # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; Alphabetic # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -1370,7 +1389,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 1D540..1D544 ; Alphabetic # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; Alphabetic # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; Alphabetic # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Alphabetic # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; Alphabetic # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; Alphabetic # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; Alphabetic # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; Alphabetic # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -1384,8 +1403,10 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 1D7C4..1D7CB ; Alphabetic # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; Alphabetic # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; Alphabetic # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; Alphabetic # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; Alphabetic # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; Alphabetic # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; Alphabetic # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; Alphabetic # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; Alphabetic # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E000..1E006 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -1458,15 +1479,16 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 1F150..1F169 ; Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z 20000..2A6DF ; Alphabetic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; Alphabetic # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; Alphabetic # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; Alphabetic # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; Alphabetic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; Alphabetic # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Alphabetic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; Alphabetic # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; Alphabetic # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F -# Total code points: 147421 +# Total code points: 160254 # ================================================ @@ -1749,7 +1771,9 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 052B ; Lowercase # L& CYRILLIC SMALL LETTER DZZHE 052D ; Lowercase # L& CYRILLIC SMALL LETTER DCHE 052F ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH DESCENDER +0558 ; Lowercase # Lm MODIFIER LETTER ARMENIAN SMALL EH 0560..0588 ; Lowercase # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; Lowercase # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 10D0..10FA ; Lowercase # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN 10FC ; Lowercase # Lm MODIFIER LETTER GEORGIAN NAR 10FD..10FF ; Lowercase # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN @@ -1908,7 +1932,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANG 1FF6..1FF7 ; Lowercase # L& [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI 2071 ; Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Lowercase # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2090..209F ; Lowercase # Lm [16] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER Z 210A ; Lowercase # L& SCRIPT SMALL G 210E..210F ; Lowercase # L& [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI 2113 ; Lowercase # L& SCRIPT SMALL L @@ -2126,7 +2150,7 @@ FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 10780 ; Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA 10783..10785 ; Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; Lowercase # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10CC0..10CF2 ; Lowercase # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US 10D70..10D85 ; Lowercase # L& [22] GARAY SMALL LETTER A..GARAY SMALL LETTER OLD NA 118C0..118DF ; Lowercase # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO @@ -2148,7 +2172,7 @@ FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 1D5EE..1D607 ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z 1D622..1D63B ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z 1D656..1D66F ; Lowercase # L& [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D68A..1D6A5 ; Lowercase # L& [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D68A..1D6A6 ; Lowercase # L& [29] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6C2..1D6DA ; Lowercase # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6E1 ; Lowercase # L& [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL 1D6FC..1D714 ; Lowercase # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA @@ -2161,12 +2185,29 @@ FF41..FF5A ; Lowercase # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 1D7C4..1D7C9 ; Lowercase # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 1D7CB ; Lowercase # L& MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; Lowercase # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK -1DF0B..1DF1E ; Lowercase # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; Lowercase # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF3F ; Lowercase # L& [53] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER BARRED W +1DF41..1DF47 ; Lowercase # L& [7] LATIN SMALL LETTER BARRED A..LATIN SMALL LETTER BARRED H WITH HOOK +1DF49 ; Lowercase # L& LATIN SMALL LETTER BARRED K +1DF4B..1DF4C ; Lowercase # L& [2] LATIN SMALL LETTER BARRED M..LATIN SMALL LETTER BARRED M WITH HOOK +1DF4E..1DF50 ; Lowercase # L& [3] LATIN SMALL LETTER BARRED N..LATIN SMALL LETTER TURNED R WITH STROKE +1DF52..1DF67 ; Lowercase # L& [22] LATIN SMALL LETTER BARRED V..LATIN SMALL LETTER LEZH WITH CURL +1DF69 ; Lowercase # L& LATIN SMALL LETTER PHONOTYPIC A WITH SWASH +1DF6B ; Lowercase # L& LATIN SMALL LETTER PHONOTYPIC ROUNDTOP A +1DF6D ; Lowercase # L& LATIN SMALL LETTER REVERSED SCRUPLE +1DF6F..1DF71 ; Lowercase # L& [3] LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI..LATIN SMALL LETTER STRETCHED I +1DF73 ; Lowercase # L& LATIN SMALL LETTER O WITH CURL +1DF75 ; Lowercase # L& LATIN SMALL LETTER CLOSED OMEGA WITH LONG STEM +1DF77 ; Lowercase # L& LATIN SMALL LETTER TURNED CLOSED OMEGA +1DF79 ; Lowercase # L& LATIN SMALL LETTER PHONOTYPIC TH +1DF7B ; Lowercase # L& LATIN SMALL LETTER U WITH HOOK TAIL +1DF7D ; Lowercase # L& LATIN SMALL LETTER U WITH NOTCH AT BOTTOM +1DF7F ; Lowercase # L& LATIN SMALL LETTER REVERSED U +1DF90..1DF96 ; Lowercase # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; Lowercase # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E922..1E943 ; Lowercase # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 2595 +# Total code points: 2740 # ================================================ @@ -2784,8 +2825,10 @@ A7D4 ; Uppercase # L& LATIN CAPITAL LETTER DOUBLE WYNN A7D6 ; Uppercase # L& LATIN CAPITAL LETTER MIDDLE SCOTS S A7D8 ; Uppercase # L& LATIN CAPITAL LETTER SIGMOID S A7DA ; Uppercase # L& LATIN CAPITAL LETTER LAMBDA -A7DC ; Uppercase # L& LATIN CAPITAL LETTER LAMBDA WITH STROKE +A7DC..A7DD ; Uppercase # L& [2] LATIN CAPITAL LETTER LAMBDA WITH STROKE..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Uppercase # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F5 ; Uppercase # L& LATIN CAPITAL LETTER REVERSED HALF H +AB6C..AB6D ; Uppercase # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z 10400..10427 ; Uppercase # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW 104B0..104D3 ; Uppercase # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA @@ -2829,12 +2872,28 @@ FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH 1D756..1D76E ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA 1D790..1D7A8 ; Uppercase # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA 1D7CA ; Uppercase # L& MATHEMATICAL BOLD CAPITAL DIGAMMA +1DF40 ; Uppercase # L& LATIN CAPITAL LETTER BARRED A +1DF48 ; Uppercase # L& LATIN CAPITAL LETTER BARRED K +1DF4A ; Uppercase # L& LATIN CAPITAL LETTER BARRED M +1DF4D ; Uppercase # L& LATIN CAPITAL LETTER BARRED N +1DF51 ; Uppercase # L& LATIN CAPITAL LETTER BARRED V +1DF68 ; Uppercase # L& LATIN CAPITAL LETTER PHONOTYPIC A WITH SWASH +1DF6A ; Uppercase # L& LATIN CAPITAL LETTER PHONOTYPIC ROUNDTOP A +1DF6C ; Uppercase # L& LATIN CAPITAL LETTER REVERSED SCRUPLE +1DF6E ; Uppercase # L& LATIN CAPITAL LETTER PHONOTYPIC DIPHTHONG AI +1DF72 ; Uppercase # L& LATIN CAPITAL LETTER O WITH CURL +1DF74 ; Uppercase # L& LATIN CAPITAL LETTER CLOSED OMEGA WITH LONG STEM +1DF76 ; Uppercase # L& LATIN CAPITAL LETTER TURNED CLOSED OMEGA +1DF78 ; Uppercase # L& LATIN CAPITAL LETTER PHONOTYPIC TH +1DF7A ; Uppercase # L& LATIN CAPITAL LETTER U WITH HOOK TAIL +1DF7C ; Uppercase # L& LATIN CAPITAL LETTER U WITH NOTCH AT BOTTOM +1DF7E ; Uppercase # L& LATIN CAPITAL LETTER REVERSED U 1E900..1E921 ; Uppercase # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA 1F130..1F149 ; Uppercase # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Uppercase # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Uppercase # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 2006 +# Total code points: 2026 # ================================================ @@ -2870,7 +2929,9 @@ FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH 03F7..0481 ; Cased # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA 048A..052F ; Cased # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; Cased # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0558 ; Cased # Lm MODIFIER LETTER ARMENIAN SMALL EH 0560..0588 ; Cased # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; Cased # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 10A0..10C5 ; Cased # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE 10C7 ; Cased # L& GEORGIAN CAPITAL LETTER YN 10CD ; Cased # L& GEORGIAN CAPITAL LETTER AEN @@ -2909,7 +2970,7 @@ FF21..FF3A ; Uppercase # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH 1FF6..1FFC ; Cased # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI 2071 ; Cased # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; Cased # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Cased # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2090..209F ; Cased # Lm [16] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER Z 2102 ; Cased # L& DOUBLE-STRUCK CAPITAL C 2107 ; Cased # L& EULER CONSTANT 210A..2113 ; Cased # L& [10] SCRIPT SMALL G..SCRIPT SMALL L @@ -2942,7 +3003,8 @@ A722..A76F ; Cased # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN A770 ; Cased # Lm MODIFIER LETTER US A771..A787 ; Cased # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T A78B..A78E ; Cased # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -A790..A7DC ; Cased # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; Cased # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Cased # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; Cased # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; Cased # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F8..A7F9 ; Cased # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -2951,6 +3013,7 @@ AB30..AB5A ; Cased # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LE AB5C..AB5F ; Cased # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; Cased # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; Cased # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; Cased # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; Cased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Cased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; Cased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -2970,7 +3033,7 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 10780 ; Cased # Lm MODIFIER LETTER SMALL CAPITAL AA 10783..10785 ; Cased # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Cased # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; Cased # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; Cased # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10C80..10CB2 ; Cased # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US 10CC0..10CF2 ; Cased # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US 10D50..10D65 ; Cased # L& [22] GARAY CAPITAL LETTER A..GARAY CAPITAL LETTER OLD NA @@ -2997,7 +3060,7 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 1D540..1D544 ; Cased # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; Cased # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; Cased # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Cased # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; Cased # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; Cased # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; Cased # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; Cased # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -3010,15 +3073,16 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 1D7AA..1D7C2 ; Cased # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 1D7C4..1D7CB ; Cased # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; Cased # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK -1DF0B..1DF1E ; Cased # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; Cased # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; Cased # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF90..1DF96 ; Cased # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; Cased # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; Cased # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E900..1E943 ; Cased # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA 1F130..1F149 ; Cased # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Cased # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Cased # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 4632 +# Total code points: 4797 # ================================================ @@ -3057,13 +3121,14 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 0387 ; Case_Ignorable # Po GREEK ANO TELEIA 0483..0487 ; Case_Ignorable # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE 0488..0489 ; Case_Ignorable # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -0559 ; Case_Ignorable # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; Case_Ignorable # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 055F ; Case_Ignorable # Po ARMENIAN ABBREVIATION MARK +058B..058C ; Case_Ignorable # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 0591..05BD ; Case_Ignorable # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 05BF ; Case_Ignorable # Mn HEBREW POINT RAFE 05C1..05C2 ; Case_Ignorable # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; Case_Ignorable # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Case_Ignorable # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; Case_Ignorable # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 05F4 ; Case_Ignorable # Po HEBREW PUNCTUATION GERSHAYIM 0600..0605 ; Case_Ignorable # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE 0610..061A ; Case_Ignorable # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA @@ -3133,7 +3198,7 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 0B3F ; Case_Ignorable # Mn ORIYA VOWEL SIGN I 0B41..0B44 ; Case_Ignorable # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR 0B4D ; Case_Ignorable # Mn ORIYA SIGN VIRAMA -0B55..0B56 ; Case_Ignorable # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B53..0B56 ; Case_Ignorable # Mn [4] ORIYA SIGN DOT ABOVE..ORIYA AI LENGTH MARK 0B62..0B63 ; Case_Ignorable # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL 0B82 ; Case_Ignorable # Mn TAMIL SIGN ANUSVARA 0BC0 ; Case_Ignorable # Mn TAMIL VOWEL SIGN II @@ -3224,8 +3289,7 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 1AA7 ; Case_Ignorable # Lm TAI THAM SIGN MAI YAMOK 1AB0..1ABD ; Case_Ignorable # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 1ABE ; Case_Ignorable # Me COMBINING PARENTHESES OVERLAY -1ABF..1ADD ; Case_Ignorable # Mn [31] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOT-AND-RING BELOW -1AE0..1AEB ; Case_Ignorable # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1ABF..1AF0 ; Case_Ignorable # Mn [50] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOUBLE COMMA ABOVE 1B00..1B03 ; Case_Ignorable # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 1B34 ; Case_Ignorable # Mn BALINESE SIGN REREKAN 1B36..1B3A ; Case_Ignorable # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA @@ -3269,7 +3333,7 @@ FF41..FF5A ; Cased # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 2066..206F ; Case_Ignorable # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES 2071 ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; Case_Ignorable # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Case_Ignorable # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; Case_Ignorable # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 20D0..20DC ; Case_Ignorable # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; Case_Ignorable # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1 ; Case_Ignorable # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -3369,7 +3433,7 @@ FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI 10376..1037A ; Case_Ignorable # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII 10780..10785 ; Case_Ignorable # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Case_Ignorable # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; Case_Ignorable # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; Case_Ignorable # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10A01..10A03 ; Case_Ignorable # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R 10A05..10A06 ; Case_Ignorable # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O 10A0C..10A0F ; Case_Ignorable # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA @@ -3382,7 +3446,9 @@ FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI 10D6F ; Case_Ignorable # Lm GARAY REDUPLICATION MARK 10EAB..10EAC ; Case_Ignorable # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK 10EC5 ; Case_Ignorable # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW -10EFA..10EFF ; Case_Ignorable # Mn [6] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC SMALL LOW WORD MADDA +10EC9..10ECA ; Case_Ignorable # Sk [2] ARABIC SMALL BASELINE FATHA..ARABIC SMALL BASELINE DOTLESS HEAD OF KHAH +10ECB..10ECF ; Case_Ignorable # Mn [5] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC LARGE CIRCLE ABOVE +10EF0..10EFF ; Case_Ignorable # Mn [16] ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO..ARABIC SMALL LOW WORD MADDA 10F46..10F50 ; Case_Ignorable # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F82..10F85 ; Case_Ignorable # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW 11001 ; Case_Ignorable # Mn BRAHMI SIGN ANUSVARA @@ -3478,6 +3544,7 @@ FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI 11D95 ; Case_Ignorable # Mn GUNJALA GONDI SIGN ANUSVARA 11D97 ; Case_Ignorable # Mn GUNJALA GONDI VIRAMA 11DD9 ; Case_Ignorable # Lm TOLONG SIKI SIGN SELA +11DF0 ; Case_Ignorable # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE 11EF3..11EF4 ; Case_Ignorable # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11F00..11F01 ; Case_Ignorable # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA 11F36..11F3A ; Case_Ignorable # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R @@ -3508,18 +3575,21 @@ FFF9..FFFB ; Case_Ignorable # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLI 1BCA0..1BCA3 ; Case_Ignorable # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 1CF00..1CF2D ; Case_Ignorable # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT 1CF30..1CF46 ; Case_Ignorable # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D127..1D128 ; Case_Ignorable # Mn [2] MUSICAL SYMBOL COMBINING STRESS..MUSICAL SYMBOL COMBINING UNSTRESS 1D167..1D169 ; Case_Ignorable # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 1D173..1D17A ; Case_Ignorable # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 1D17B..1D182 ; Case_Ignorable # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE 1D185..1D18B ; Case_Ignorable # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; Case_Ignorable # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO 1D242..1D244 ; Case_Ignorable # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D25B..1D25C ; Case_Ignorable # Mn [2] MUSICAL SYMBOL COMBINING TREMOLO-4..MUSICAL SYMBOL COMBINING TREMOLO-5 1DA00..1DA36 ; Case_Ignorable # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN 1DA3B..1DA6C ; Case_Ignorable # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT 1DA75 ; Case_Ignorable # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS 1DA84 ; Case_Ignorable # Mn SIGNWRITING LOCATION HEAD NECK 1DA9B..1DA9F ; Case_Ignorable # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; Case_Ignorable # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DFCD..1DFFF ; Case_Ignorable # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E000..1E006 ; Case_Ignorable # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; Case_Ignorable # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; Case_Ignorable # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -3547,7 +3617,7 @@ E0001 ; Case_Ignorable # Cf LANGUAGE TAG E0020..E007F ; Case_Ignorable # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Case_Ignorable # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 2794 +# Total code points: 2890 # ================================================ @@ -4160,8 +4230,10 @@ A7D4 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER DOUBLE W A7D6 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER MIDDLE SCOTS S A7D8 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER SIGMOID S A7DA ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER LAMBDA -A7DC ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER LAMBDA WITH STROKE +A7DC..A7DD ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER LAMBDA WITH STROKE..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F5 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER REVERSED HALF H +AB6C..AB6D ; Changes_When_Lowercased # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING FF21..FF3A ; Changes_When_Lowercased # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z 10400..10427 ; Changes_When_Lowercased # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW 104B0..104D3 ; Changes_When_Lowercased # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA @@ -4174,9 +4246,25 @@ FF21..FF3A ; Changes_When_Lowercased # L& [26] FULLWIDTH LATIN CAPITAL LETTE 118A0..118BF ; Changes_When_Lowercased # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO 16E40..16E5F ; Changes_When_Lowercased # L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y 16EA0..16EB8 ; Changes_When_Lowercased # L& [25] BERIA ERFE CAPITAL LETTER ARKAB..BERIA ERFE CAPITAL LETTER AY +1DF40 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BARRED A +1DF48 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BARRED K +1DF4A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BARRED M +1DF4D ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BARRED N +1DF51 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER BARRED V +1DF68 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER PHONOTYPIC A WITH SWASH +1DF6A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER PHONOTYPIC ROUNDTOP A +1DF6C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER REVERSED SCRUPLE +1DF6E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER PHONOTYPIC DIPHTHONG AI +1DF72 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER O WITH CURL +1DF74 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER CLOSED OMEGA WITH LONG STEM +1DF76 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER TURNED CLOSED OMEGA +1DF78 ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER PHONOTYPIC TH +1DF7A ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH HOOK TAIL +1DF7C ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER U WITH NOTCH AT BOTTOM +1DF7E ; Changes_When_Lowercased # L& LATIN CAPITAL LETTER REVERSED U 1E900..1E921 ; Changes_When_Lowercased # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA -# Total code points: 1488 +# Total code points: 1508 # ================================================ @@ -4339,7 +4427,8 @@ FF21..FF3A ; Changes_When_Lowercased # L& [26] FULLWIDTH LATIN CAPITAL LETTE 026F ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED M 0271..0272 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK 0275 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED O -027D ; Changes_When_Uppercased # L& LATIN SMALL LETTER R WITH TAIL +0277 ; Changes_When_Uppercased # L& LATIN SMALL LETTER CLOSED OMEGA +027C..027D ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER R WITH LONG LEG..LATIN SMALL LETTER R WITH TAIL 0280 ; Changes_When_Uppercased # L& LATIN LETTER SMALL CAPITAL R 0282..0283 ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER S WITH HOOK..LATIN SMALL LETTER ESH 0287..028C ; Changes_When_Uppercased # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V @@ -4803,6 +4892,7 @@ A7D7 ; Changes_When_Uppercased # L& LATIN SMALL LETTER MIDDLE SCO A7D9 ; Changes_When_Uppercased # L& LATIN SMALL LETTER SIGMOID S A7DB ; Changes_When_Uppercased # L& LATIN SMALL LETTER LAMBDA A7F6 ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED HALF H +AB4B..AB4C ; Changes_When_Uppercased # L& [2] LATIN SMALL LETTER SCRIPT R..LATIN SMALL LETTER SCRIPT R WITH RING AB53 ; Changes_When_Uppercased # L& LATIN SMALL LETTER CHI AB70..ABBF ; Changes_When_Uppercased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Changes_When_Uppercased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST @@ -4819,9 +4909,26 @@ FF41..FF5A ; Changes_When_Uppercased # L& [26] FULLWIDTH LATIN SMALL LETTER 118C0..118DF ; Changes_When_Uppercased # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO 16E60..16E7F ; Changes_When_Uppercased # L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y 16EBB..16ED3 ; Changes_When_Uppercased # L& [25] BERIA ERFE SMALL LETTER ARKAB..BERIA ERFE SMALL LETTER AY +1DF41 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED A +1DF49 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED K +1DF4B ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED M +1DF4E ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED N +1DF52 ; Changes_When_Uppercased # L& LATIN SMALL LETTER BARRED V +1DF69 ; Changes_When_Uppercased # L& LATIN SMALL LETTER PHONOTYPIC A WITH SWASH +1DF6B ; Changes_When_Uppercased # L& LATIN SMALL LETTER PHONOTYPIC ROUNDTOP A +1DF6D ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED SCRUPLE +1DF6F ; Changes_When_Uppercased # L& LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI +1DF73 ; Changes_When_Uppercased # L& LATIN SMALL LETTER O WITH CURL +1DF75 ; Changes_When_Uppercased # L& LATIN SMALL LETTER CLOSED OMEGA WITH LONG STEM +1DF77 ; Changes_When_Uppercased # L& LATIN SMALL LETTER TURNED CLOSED OMEGA +1DF79 ; Changes_When_Uppercased # L& LATIN SMALL LETTER PHONOTYPIC TH +1DF7B ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH HOOK TAIL +1DF7D ; Changes_When_Uppercased # L& LATIN SMALL LETTER U WITH NOTCH AT BOTTOM +1DF7F ; Changes_When_Uppercased # L& LATIN SMALL LETTER REVERSED U +1DF95 ; Changes_When_Uppercased # L& LATIN SMALL LIGATURE LONG S WITH DESCENDER S 1E922..1E943 ; Changes_When_Uppercased # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 1580 +# Total code points: 1601 # ================================================ @@ -4985,7 +5092,8 @@ FF41..FF5A ; Changes_When_Uppercased # L& [26] FULLWIDTH LATIN SMALL LETTER 026F ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED M 0271..0272 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK 0275 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED O -027D ; Changes_When_Titlecased # L& LATIN SMALL LETTER R WITH TAIL +0277 ; Changes_When_Titlecased # L& LATIN SMALL LETTER CLOSED OMEGA +027C..027D ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER R WITH LONG LEG..LATIN SMALL LETTER R WITH TAIL 0280 ; Changes_When_Titlecased # L& LATIN LETTER SMALL CAPITAL R 0282..0283 ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER S WITH HOOK..LATIN SMALL LETTER ESH 0287..028C ; Changes_When_Titlecased # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V @@ -5447,6 +5555,7 @@ A7D7 ; Changes_When_Titlecased # L& LATIN SMALL LETTER MIDDLE SCO A7D9 ; Changes_When_Titlecased # L& LATIN SMALL LETTER SIGMOID S A7DB ; Changes_When_Titlecased # L& LATIN SMALL LETTER LAMBDA A7F6 ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED HALF H +AB4B..AB4C ; Changes_When_Titlecased # L& [2] LATIN SMALL LETTER SCRIPT R..LATIN SMALL LETTER SCRIPT R WITH RING AB53 ; Changes_When_Titlecased # L& LATIN SMALL LETTER CHI AB70..ABBF ; Changes_When_Titlecased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Changes_When_Titlecased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST @@ -5463,9 +5572,26 @@ FF41..FF5A ; Changes_When_Titlecased # L& [26] FULLWIDTH LATIN SMALL LETTER 118C0..118DF ; Changes_When_Titlecased # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO 16E60..16E7F ; Changes_When_Titlecased # L& [32] MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y 16EBB..16ED3 ; Changes_When_Titlecased # L& [25] BERIA ERFE SMALL LETTER ARKAB..BERIA ERFE SMALL LETTER AY +1DF41 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED A +1DF49 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED K +1DF4B ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED M +1DF4E ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED N +1DF52 ; Changes_When_Titlecased # L& LATIN SMALL LETTER BARRED V +1DF69 ; Changes_When_Titlecased # L& LATIN SMALL LETTER PHONOTYPIC A WITH SWASH +1DF6B ; Changes_When_Titlecased # L& LATIN SMALL LETTER PHONOTYPIC ROUNDTOP A +1DF6D ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED SCRUPLE +1DF6F ; Changes_When_Titlecased # L& LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI +1DF73 ; Changes_When_Titlecased # L& LATIN SMALL LETTER O WITH CURL +1DF75 ; Changes_When_Titlecased # L& LATIN SMALL LETTER CLOSED OMEGA WITH LONG STEM +1DF77 ; Changes_When_Titlecased # L& LATIN SMALL LETTER TURNED CLOSED OMEGA +1DF79 ; Changes_When_Titlecased # L& LATIN SMALL LETTER PHONOTYPIC TH +1DF7B ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH HOOK TAIL +1DF7D ; Changes_When_Titlecased # L& LATIN SMALL LETTER U WITH NOTCH AT BOTTOM +1DF7F ; Changes_When_Titlecased # L& LATIN SMALL LETTER REVERSED U +1DF95 ; Changes_When_Titlecased # L& LATIN SMALL LIGATURE LONG S WITH DESCENDER S 1E922..1E943 ; Changes_When_Titlecased # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 1507 +# Total code points: 1528 # ================================================ @@ -6087,8 +6213,10 @@ A7D4 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER DOUBLE W A7D6 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER MIDDLE SCOTS S A7D8 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER SIGMOID S A7DA ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER LAMBDA -A7DC ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER LAMBDA WITH STROKE +A7DC..A7DD ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER LAMBDA WITH STROKE..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F5 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER REVERSED HALF H +AB6C..AB6D ; Changes_When_Casefolded # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; Changes_When_Casefolded # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Changes_When_Casefolded # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; Changes_When_Casefolded # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -6104,9 +6232,26 @@ FF21..FF3A ; Changes_When_Casefolded # L& [26] FULLWIDTH LATIN CAPITAL LETTE 118A0..118BF ; Changes_When_Casefolded # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO 16E40..16E5F ; Changes_When_Casefolded # L& [32] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN CAPITAL LETTER Y 16EA0..16EB8 ; Changes_When_Casefolded # L& [25] BERIA ERFE CAPITAL LETTER ARKAB..BERIA ERFE CAPITAL LETTER AY +1DF40 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BARRED A +1DF48 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BARRED K +1DF4A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BARRED M +1DF4D ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BARRED N +1DF51 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER BARRED V +1DF68 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER PHONOTYPIC A WITH SWASH +1DF6A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER PHONOTYPIC ROUNDTOP A +1DF6C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER REVERSED SCRUPLE +1DF6E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER PHONOTYPIC DIPHTHONG AI +1DF72 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER O WITH CURL +1DF74 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER CLOSED OMEGA WITH LONG STEM +1DF76 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER TURNED CLOSED OMEGA +1DF78 ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER PHONOTYPIC TH +1DF7A ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH HOOK TAIL +1DF7C ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER U WITH NOTCH AT BOTTOM +1DF7E ; Changes_When_Casefolded # L& LATIN CAPITAL LETTER REVERSED U +1DF95 ; Changes_When_Casefolded # L& LATIN SMALL LIGATURE LONG S WITH DESCENDER S 1E900..1E921 ; Changes_When_Casefolded # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA -# Total code points: 1561 +# Total code points: 1582 # ================================================ @@ -6139,7 +6284,8 @@ FF21..FF3A ; Changes_When_Casefolded # L& [26] FULLWIDTH LATIN CAPITAL LETTE 026F ; Changes_When_Casemapped # L& LATIN SMALL LETTER TURNED M 0271..0272 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER M WITH HOOK..LATIN SMALL LETTER N WITH LEFT HOOK 0275 ; Changes_When_Casemapped # L& LATIN SMALL LETTER BARRED O -027D ; Changes_When_Casemapped # L& LATIN SMALL LETTER R WITH TAIL +0277 ; Changes_When_Casemapped # L& LATIN SMALL LETTER CLOSED OMEGA +027C..027D ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER R WITH LONG LEG..LATIN SMALL LETTER R WITH TAIL 0280 ; Changes_When_Casemapped # L& LATIN LETTER SMALL CAPITAL R 0282..0283 ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER S WITH HOOK..LATIN SMALL LETTER ESH 0287..028C ; Changes_When_Casemapped # L& [6] LATIN SMALL LETTER TURNED T..LATIN SMALL LETTER TURNED V @@ -6219,9 +6365,12 @@ A779..A787 ; Changes_When_Casemapped # L& [15] LATIN CAPITAL LETTER INSULAR A78B..A78D ; Changes_When_Casemapped # L& [3] LATIN CAPITAL LETTER SALTILLO..LATIN CAPITAL LETTER TURNED H A790..A794 ; Changes_When_Casemapped # L& [5] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER C WITH PALATAL HOOK A796..A7AE ; Changes_When_Casemapped # L& [25] LATIN CAPITAL LETTER B WITH FLOURISH..LATIN CAPITAL LETTER SMALL CAPITAL I -A7B0..A7DC ; Changes_When_Casemapped # L& [45] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A7B0..A7DD ; Changes_When_Casemapped # L& [46] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; Changes_When_Casemapped # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F5..A7F6 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +AB4B..AB4C ; Changes_When_Casemapped # L& [2] LATIN SMALL LETTER SCRIPT R..LATIN SMALL LETTER SCRIPT R WITH RING AB53 ; Changes_When_Casemapped # L& LATIN SMALL LETTER CHI +AB6C..AB6D ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; Changes_When_Casemapped # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Changes_When_Casemapped # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; Changes_When_Casemapped # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -6246,9 +6395,16 @@ FF41..FF5A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN SMALL LETTER 16E40..16E7F ; Changes_When_Casemapped # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y 16EA0..16EB8 ; Changes_When_Casemapped # L& [25] BERIA ERFE CAPITAL LETTER ARKAB..BERIA ERFE CAPITAL LETTER AY 16EBB..16ED3 ; Changes_When_Casemapped # L& [25] BERIA ERFE SMALL LETTER ARKAB..BERIA ERFE SMALL LETTER AY +1DF40..1DF41 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER BARRED A..LATIN SMALL LETTER BARRED A +1DF48..1DF4B ; Changes_When_Casemapped # L& [4] LATIN CAPITAL LETTER BARRED K..LATIN SMALL LETTER BARRED M +1DF4D..1DF4E ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER BARRED N..LATIN SMALL LETTER BARRED N +1DF51..1DF52 ; Changes_When_Casemapped # L& [2] LATIN CAPITAL LETTER BARRED V..LATIN SMALL LETTER BARRED V +1DF68..1DF6F ; Changes_When_Casemapped # L& [8] LATIN CAPITAL LETTER PHONOTYPIC A WITH SWASH..LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI +1DF72..1DF7F ; Changes_When_Casemapped # L& [14] LATIN CAPITAL LETTER O WITH CURL..LATIN SMALL LETTER REVERSED U +1DF95 ; Changes_When_Casemapped # L& LATIN SMALL LIGATURE LONG S WITH DESCENDER S 1E900..1E943 ; Changes_When_Casemapped # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 3037 +# Total code points: 3078 # ================================================ @@ -6294,8 +6450,9 @@ FF41..FF5A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN SMALL LETTER 03F7..0481 ; ID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA 048A..052F ; ID_Start # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; ID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; ID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; ID_Start # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 0560..0588 ; ID_Start # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; ID_Start # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 05D0..05EA ; ID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; ID_Start # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 0620..063F ; ID_Start # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE @@ -6541,7 +6698,7 @@ FF41..FF5A ; Changes_When_Casemapped # L& [26] FULLWIDTH LATIN SMALL LETTER 1FF6..1FFC ; ID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI 2071 ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; ID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; ID_Start # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; ID_Start # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 2102 ; ID_Start # L& DOUBLE-STRUCK CAPITAL C 2107 ; ID_Start # L& EULER CONSTANT 210A..2113 ; ID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L @@ -6624,7 +6781,8 @@ A771..A787 ; ID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER I A788 ; ID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; ID_Start # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; ID_Start # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; ID_Start # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; ID_Start # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; ID_Start # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; ID_Start # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; ID_Start # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; ID_Start # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -6675,6 +6833,7 @@ AB30..AB5A ; ID_Start # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL AB5C..AB5F ; ID_Start # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; ID_Start # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; ID_Start # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; ID_Start # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; ID_Start # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; ID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM AC00..D7A3 ; ID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH @@ -6749,7 +6908,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 10760..10767 ; ID_Start # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; ID_Start # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; ID_Start # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; ID_Start # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; ID_Start # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; ID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; ID_Start # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; ID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -6792,6 +6951,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 10EC2..10EC4 ; ID_Start # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; ID_Start # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; ID_Start # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW +10ED9..10EEE ; ID_Start # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH 10F00..10F1C ; ID_Start # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; ID_Start # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; ID_Start # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -6871,6 +7031,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 11A5C..11A89 ; ID_Start # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA 11A9D ; ID_Start # Lo SOYOMBO MARK PLUTA 11AB0..11AF8 ; ID_Start # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B0A ; ID_Start # Lo DEVANAGARI LETTER ALTERNATE DDDA 11BC0..11BE0 ; ID_Start # Lo [33] SUNUWAR LETTER DEVI..SUNUWAR LETTER KLOKO 11C00..11C08 ; ID_Start # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; ID_Start # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -6887,14 +7048,17 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 11DB0..11DD8 ; ID_Start # Lo [41] TOLONG SIKI LETTER I..TOLONG SIKI LETTER RRH 11DD9 ; ID_Start # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; ID_Start # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA +11DF1 ; ID_Start # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; ID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11F02 ; ID_Start # Lo KAWI SIGN REPHA 11F04..11F10 ; ID_Start # Lo [13] KAWI LETTER A..KAWI LETTER O 11F12..11F33 ; ID_Start # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA 11FB0 ; ID_Start # Lo LISU LETTER YHA 12000..12399 ; ID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; ID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; ID_Start # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU +12475..1247F ; ID_Start # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; ID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; ID_Start # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; ID_Start # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342F ; ID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D 13441..13446 ; ID_Start # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN @@ -6922,17 +7086,19 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 16FE3 ; ID_Start # Lm OLD CHINESE ITERATION MARK 16FF2..16FF3 ; ID_Start # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; ID_Start # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; ID_Start # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; ID_Start # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; ID_Start # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; ID_Start # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; ID_Start # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; ID_Start # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; ID_Start # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; ID_Start # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; ID_Start # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; ID_Start # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B122 ; ID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B000..1B128 ; ID_Start # Lo [297] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ALTERNATE WI 1B132 ; ID_Start # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; ID_Start # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; ID_Start # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; ID_Start # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; ID_Start # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; ID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; ID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; ID_Start # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -6956,7 +7122,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1D540..1D544 ; ID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; ID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; ID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; ID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; ID_Start # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; ID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; ID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; ID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -6970,8 +7136,10 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1D7C4..1D7CB ; ID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; ID_Start # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; ID_Start # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; ID_Start # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; ID_Start # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; ID_Start # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; ID_Start # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; ID_Start # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; ID_Start # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; ID_Start # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E100..1E12C ; ID_Start # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; ID_Start # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -7030,15 +7198,16 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1EEA5..1EEA9 ; ID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; ID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 20000..2A6DF ; ID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; ID_Start # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; ID_Start # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; ID_Start # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; ID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; ID_Start # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; ID_Start # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; ID_Start # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F -# Total code points: 145916 +# Total code points: 158739 # ================================================ @@ -7091,13 +7260,14 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 0483..0487 ; ID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE 048A..052F ; ID_Continue # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; ID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; ID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; ID_Continue # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 0560..0588 ; ID_Continue # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; ID_Continue # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 0591..05BD ; ID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 05BF ; ID_Continue # Mn HEBREW POINT RAFE 05C1..05C2 ; ID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; ID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; ID_Continue # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; ID_Continue # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 05D0..05EA ; ID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; ID_Continue # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 0610..061A ; ID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA @@ -7252,7 +7422,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 0B47..0B48 ; ID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI 0B4B..0B4C ; ID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0B4D ; ID_Continue # Mn ORIYA SIGN VIRAMA -0B55..0B56 ; ID_Continue # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B53..0B56 ; ID_Continue # Mn [4] ORIYA SIGN DOT ABOVE..ORIYA AI LENGTH MARK 0B57 ; ID_Continue # Mc ORIYA AU LENGTH MARK 0B5C..0B5D ; ID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA 0B5F..0B61 ; ID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL @@ -7533,8 +7703,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1A90..1A99 ; ID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE 1AA7 ; ID_Continue # Lm TAI THAM SIGN MAI YAMOK 1AB0..1ABD ; ID_Continue # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABF..1ADD ; ID_Continue # Mn [31] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOT-AND-RING BELOW -1AE0..1AEB ; ID_Continue # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1ABF..1AF0 ; ID_Continue # Mn [50] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOUBLE COMMA ABOVE 1B00..1B03 ; ID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 1B04 ; ID_Continue # Mc BALINESE SIGN BISAH 1B05..1B33 ; ID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA @@ -7625,7 +7794,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 2054 ; ID_Continue # Pc INVERTED UNDERTIE 2071 ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; ID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; ID_Continue # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; ID_Continue # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 20D0..20DC ; ID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20E1 ; ID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE 20E5..20F0 ; ID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE @@ -7723,7 +7892,8 @@ A771..A787 ; ID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTE A788 ; ID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; ID_Continue # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; ID_Continue # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; ID_Continue # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; ID_Continue # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; ID_Continue # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; ID_Continue # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; ID_Continue # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; ID_Continue # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -7824,6 +7994,7 @@ AB30..AB5A ; ID_Continue # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SM AB5C..AB5F ; ID_Continue # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; ID_Continue # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; ID_Continue # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; ID_Continue # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; ID_Continue # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; ID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM ABE3..ABE4 ; ID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP @@ -7918,7 +8089,7 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 10760..10767 ; ID_Continue # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; ID_Continue # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; ID_Continue # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; ID_Continue # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; ID_Continue # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; ID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; ID_Continue # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; ID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -7972,7 +8143,9 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 10EC2..10EC4 ; ID_Continue # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; ID_Continue # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; ID_Continue # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW -10EFA..10EFF ; ID_Continue # Mn [6] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC SMALL LOW WORD MADDA +10ECB..10ECF ; ID_Continue # Mn [5] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC LARGE CIRCLE ABOVE +10ED9..10EEE ; ID_Continue # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH +10EF0..10EFF ; ID_Continue # Mn [16] ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO..ARABIC SMALL LOW WORD MADDA 10F00..10F1C ; ID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; ID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; ID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -8199,6 +8372,7 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 11A98..11A99 ; ID_Continue # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11A9D ; ID_Continue # Lo SOYOMBO MARK PLUTA 11AB0..11AF8 ; ID_Continue # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B0A ; ID_Continue # Lo DEVANAGARI LETTER ALTERNATE DDDA 11B60 ; ID_Continue # Mn SHARADA VOWEL SIGN OE 11B61 ; ID_Continue # Mc SHARADA VOWEL SIGN OOE 11B62..11B64 ; ID_Continue # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E @@ -8249,6 +8423,8 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 11DD9 ; ID_Continue # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; ID_Continue # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA 11DE0..11DE9 ; ID_Continue # Nd [10] TOLONG SIKI DIGIT ZERO..TOLONG SIKI DIGIT NINE +11DF0 ; ID_Continue # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE +11DF1 ; ID_Continue # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; ID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; ID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; ID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O @@ -8267,8 +8443,10 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 11F5A ; ID_Continue # Mn KAWI SIGN NUKTA 11FB0 ; ID_Continue # Lo LISU LETTER YHA 12000..12399 ; ID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; ID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; ID_Continue # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU +12475..1247F ; ID_Continue # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; ID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; ID_Continue # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; ID_Continue # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342F ; ID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D 13440 ; ID_Continue # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY @@ -8313,17 +8491,19 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 16FF0..16FF1 ; ID_Continue # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 16FF2..16FF3 ; ID_Continue # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; ID_Continue # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; ID_Continue # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; ID_Continue # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; ID_Continue # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; ID_Continue # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; ID_Continue # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; ID_Continue # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; ID_Continue # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; ID_Continue # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; ID_Continue # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; ID_Continue # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B122 ; ID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B000..1B128 ; ID_Continue # Lo [297] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ALTERNATE WI 1B132 ; ID_Continue # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; ID_Continue # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; ID_Continue # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; ID_Continue # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; ID_Continue # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; ID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; ID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; ID_Continue # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -8333,6 +8513,7 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 1CCF0..1CCF9 ; ID_Continue # Nd [10] OUTLINED DIGIT ZERO..OUTLINED DIGIT NINE 1CF00..1CF2D ; ID_Continue # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT 1CF30..1CF46 ; ID_Continue # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D127..1D128 ; ID_Continue # Mn [2] MUSICAL SYMBOL COMBINING STRESS..MUSICAL SYMBOL COMBINING UNSTRESS 1D165..1D166 ; ID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167..1D169 ; ID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 1D16D..1D172 ; ID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 @@ -8340,6 +8521,10 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 1D185..1D18B ; ID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; ID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO 1D242..1D244 ; ID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D250..1D252 ; ID_Continue # Mc [3] MUSICAL SYMBOL COMBINING FLAG-6..MUSICAL SYMBOL COMBINING FLAG-8 +1D25B..1D25C ; ID_Continue # Mn [2] MUSICAL SYMBOL COMBINING TREMOLO-4..MUSICAL SYMBOL COMBINING TREMOLO-5 +1D25F ; ID_Continue # Mc MUSICAL SYMBOL COMBINING BUZZ ROLL STEM +1D280..1D281 ; ID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM BOW BEHIND BRIDGE..MUSICAL SYMBOL COMBINING STEM BOW ON TOP OF BRIDGE 1D400..1D454 ; ID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G 1D456..1D49C ; ID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A 1D49E..1D49F ; ID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D @@ -8358,7 +8543,7 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 1D540..1D544 ; ID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; ID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; ID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; ID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; ID_Continue # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; ID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; ID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; ID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -8379,8 +8564,10 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 1DAA1..1DAAF ; ID_Continue # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 1DF00..1DF09 ; ID_Continue # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; ID_Continue # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; ID_Continue # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; ID_Continue # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; ID_Continue # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; ID_Continue # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; ID_Continue # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; ID_Continue # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E000..1E006 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; ID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -8462,16 +8649,17 @@ FFDA..FFDC ; ID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HAN 1EEAB..1EEBB ; ID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1FBF0..1FBF9 ; ID_Continue # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF ; ID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; ID_Continue # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; ID_Continue # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; ID_Continue # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; ID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; ID_Continue # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; ID_Continue # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; ID_Continue # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 149240 +# Total code points: 162100 # ================================================ @@ -8514,8 +8702,9 @@ E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR 03F7..0481 ; XID_Start # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA 048A..052F ; XID_Start # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; XID_Start # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; XID_Start # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; XID_Start # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 0560..0588 ; XID_Start # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; XID_Start # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 05D0..05EA ; XID_Start # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; XID_Start # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 0620..063F ; XID_Start # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE @@ -8761,7 +8950,7 @@ E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR 1FF6..1FFC ; XID_Start # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI 2071 ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; XID_Start # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; XID_Start # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; XID_Start # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 2102 ; XID_Start # L& DOUBLE-STRUCK CAPITAL C 2107 ; XID_Start # L& EULER CONSTANT 210A..2113 ; XID_Start # L& [10] SCRIPT SMALL G..SCRIPT SMALL L @@ -8843,7 +9032,8 @@ A771..A787 ; XID_Start # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER A788 ; XID_Start # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; XID_Start # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; XID_Start # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; XID_Start # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; XID_Start # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; XID_Start # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; XID_Start # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; XID_Start # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; XID_Start # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -8894,6 +9084,7 @@ AB30..AB5A ; XID_Start # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMAL AB5C..AB5F ; XID_Start # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; XID_Start # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; XID_Start # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; XID_Start # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; XID_Start # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; XID_Start # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM AC00..D7A3 ; XID_Start # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH @@ -8973,7 +9164,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 10760..10767 ; XID_Start # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; XID_Start # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; XID_Start # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; XID_Start # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; XID_Start # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; XID_Start # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; XID_Start # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; XID_Start # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -9016,6 +9207,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 10EC2..10EC4 ; XID_Start # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; XID_Start # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; XID_Start # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW +10ED9..10EEE ; XID_Start # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH 10F00..10F1C ; XID_Start # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; XID_Start # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; XID_Start # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -9095,6 +9287,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 11A5C..11A89 ; XID_Start # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA 11A9D ; XID_Start # Lo SOYOMBO MARK PLUTA 11AB0..11AF8 ; XID_Start # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B0A ; XID_Start # Lo DEVANAGARI LETTER ALTERNATE DDDA 11BC0..11BE0 ; XID_Start # Lo [33] SUNUWAR LETTER DEVI..SUNUWAR LETTER KLOKO 11C00..11C08 ; XID_Start # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; XID_Start # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -9111,14 +9304,17 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 11DB0..11DD8 ; XID_Start # Lo [41] TOLONG SIKI LETTER I..TOLONG SIKI LETTER RRH 11DD9 ; XID_Start # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; XID_Start # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA +11DF1 ; XID_Start # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; XID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11F02 ; XID_Start # Lo KAWI SIGN REPHA 11F04..11F10 ; XID_Start # Lo [13] KAWI LETTER A..KAWI LETTER O 11F12..11F33 ; XID_Start # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA 11FB0 ; XID_Start # Lo LISU LETTER YHA 12000..12399 ; XID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; XID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; XID_Start # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU +12475..1247F ; XID_Start # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; XID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; XID_Start # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; XID_Start # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342F ; XID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D 13441..13446 ; XID_Start # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN @@ -9146,17 +9342,19 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 16FE3 ; XID_Start # Lm OLD CHINESE ITERATION MARK 16FF2..16FF3 ; XID_Start # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; XID_Start # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; XID_Start # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; XID_Start # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; XID_Start # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; XID_Start # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; XID_Start # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; XID_Start # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; XID_Start # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; XID_Start # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; XID_Start # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; XID_Start # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B122 ; XID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B000..1B128 ; XID_Start # Lo [297] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ALTERNATE WI 1B132 ; XID_Start # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; XID_Start # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; XID_Start # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; XID_Start # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; XID_Start # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; XID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; XID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; XID_Start # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -9180,7 +9378,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 1D540..1D544 ; XID_Start # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; XID_Start # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; XID_Start # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; XID_Start # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; XID_Start # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; XID_Start # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; XID_Start # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; XID_Start # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -9194,8 +9392,10 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 1D7C4..1D7CB ; XID_Start # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; XID_Start # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; XID_Start # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; XID_Start # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; XID_Start # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; XID_Start # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; XID_Start # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; XID_Start # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; XID_Start # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; XID_Start # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E100..1E12C ; XID_Start # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; XID_Start # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -9254,15 +9454,16 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 1EEA5..1EEA9 ; XID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; XID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 20000..2A6DF ; XID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; XID_Start # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; XID_Start # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; XID_Start # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; XID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; XID_Start # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; XID_Start # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; XID_Start # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F -# Total code points: 145893 +# Total code points: 158716 # ================================================ @@ -9311,13 +9512,14 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 0483..0487 ; XID_Continue # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE 048A..052F ; XID_Continue # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; XID_Continue # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; XID_Continue # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; XID_Continue # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 0560..0588 ; XID_Continue # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +058B..058C ; XID_Continue # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 0591..05BD ; XID_Continue # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 05BF ; XID_Continue # Mn HEBREW POINT RAFE 05C1..05C2 ; XID_Continue # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; XID_Continue # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; XID_Continue # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; XID_Continue # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 05D0..05EA ; XID_Continue # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; XID_Continue # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 0610..061A ; XID_Continue # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA @@ -9472,7 +9674,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 0B47..0B48 ; XID_Continue # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI 0B4B..0B4C ; XID_Continue # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0B4D ; XID_Continue # Mn ORIYA SIGN VIRAMA -0B55..0B56 ; XID_Continue # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B53..0B56 ; XID_Continue # Mn [4] ORIYA SIGN DOT ABOVE..ORIYA AI LENGTH MARK 0B57 ; XID_Continue # Mc ORIYA AU LENGTH MARK 0B5C..0B5D ; XID_Continue # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA 0B5F..0B61 ; XID_Continue # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL @@ -9753,8 +9955,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 1A90..1A99 ; XID_Continue # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE 1AA7 ; XID_Continue # Lm TAI THAM SIGN MAI YAMOK 1AB0..1ABD ; XID_Continue # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABF..1ADD ; XID_Continue # Mn [31] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOT-AND-RING BELOW -1AE0..1AEB ; XID_Continue # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1ABF..1AF0 ; XID_Continue # Mn [50] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOUBLE COMMA ABOVE 1B00..1B03 ; XID_Continue # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 1B04 ; XID_Continue # Mc BALINESE SIGN BISAH 1B05..1B33 ; XID_Continue # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA @@ -9845,7 +10046,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGU 2054 ; XID_Continue # Pc INVERTED UNDERTIE 2071 ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; XID_Continue # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; XID_Continue # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; XID_Continue # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 20D0..20DC ; XID_Continue # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20E1 ; XID_Continue # Mn COMBINING LEFT RIGHT ARROW ABOVE 20E5..20F0 ; XID_Continue # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE @@ -9942,7 +10143,8 @@ A771..A787 ; XID_Continue # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETT A788 ; XID_Continue # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; XID_Continue # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; XID_Continue # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; XID_Continue # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; XID_Continue # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; XID_Continue # L& LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; XID_Continue # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; XID_Continue # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; XID_Continue # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -10043,6 +10245,7 @@ AB30..AB5A ; XID_Continue # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN S AB5C..AB5F ; XID_Continue # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; XID_Continue # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; XID_Continue # Lm MODIFIER LETTER SMALL TURNED W +AB6C..AB6D ; XID_Continue # L& [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; XID_Continue # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; XID_Continue # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM ABE3..ABE4 ; XID_Continue # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP @@ -10143,7 +10346,7 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 10760..10767 ; XID_Continue # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; XID_Continue # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; XID_Continue # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; XID_Continue # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; XID_Continue # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; XID_Continue # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; XID_Continue # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; XID_Continue # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -10197,7 +10400,9 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 10EC2..10EC4 ; XID_Continue # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; XID_Continue # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; XID_Continue # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW -10EFA..10EFF ; XID_Continue # Mn [6] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC SMALL LOW WORD MADDA +10ECB..10ECF ; XID_Continue # Mn [5] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC LARGE CIRCLE ABOVE +10ED9..10EEE ; XID_Continue # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH +10EF0..10EFF ; XID_Continue # Mn [16] ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO..ARABIC SMALL LOW WORD MADDA 10F00..10F1C ; XID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; XID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; XID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -10424,6 +10629,7 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 11A98..11A99 ; XID_Continue # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11A9D ; XID_Continue # Lo SOYOMBO MARK PLUTA 11AB0..11AF8 ; XID_Continue # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B0A ; XID_Continue # Lo DEVANAGARI LETTER ALTERNATE DDDA 11B60 ; XID_Continue # Mn SHARADA VOWEL SIGN OE 11B61 ; XID_Continue # Mc SHARADA VOWEL SIGN OOE 11B62..11B64 ; XID_Continue # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E @@ -10474,6 +10680,8 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 11DD9 ; XID_Continue # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; XID_Continue # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA 11DE0..11DE9 ; XID_Continue # Nd [10] TOLONG SIKI DIGIT ZERO..TOLONG SIKI DIGIT NINE +11DF0 ; XID_Continue # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE +11DF1 ; XID_Continue # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; XID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; XID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; XID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O @@ -10492,8 +10700,10 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 11F5A ; XID_Continue # Mn KAWI SIGN NUKTA 11FB0 ; XID_Continue # Lo LISU LETTER YHA 12000..12399 ; XID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; XID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; XID_Continue # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU +12475..1247F ; XID_Continue # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; XID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; XID_Continue # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; XID_Continue # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342F ; XID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D 13440 ; XID_Continue # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY @@ -10538,17 +10748,19 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 16FF0..16FF1 ; XID_Continue # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 16FF2..16FF3 ; XID_Continue # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; XID_Continue # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; XID_Continue # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; XID_Continue # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; XID_Continue # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; XID_Continue # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; XID_Continue # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; XID_Continue # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; XID_Continue # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; XID_Continue # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; XID_Continue # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; XID_Continue # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -1B000..1B122 ; XID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B000..1B128 ; XID_Continue # Lo [297] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ALTERNATE WI 1B132 ; XID_Continue # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; XID_Continue # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; XID_Continue # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; XID_Continue # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; XID_Continue # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; XID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; XID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; XID_Continue # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -10558,6 +10770,7 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 1CCF0..1CCF9 ; XID_Continue # Nd [10] OUTLINED DIGIT ZERO..OUTLINED DIGIT NINE 1CF00..1CF2D ; XID_Continue # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT 1CF30..1CF46 ; XID_Continue # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D127..1D128 ; XID_Continue # Mn [2] MUSICAL SYMBOL COMBINING STRESS..MUSICAL SYMBOL COMBINING UNSTRESS 1D165..1D166 ; XID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167..1D169 ; XID_Continue # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 1D16D..1D172 ; XID_Continue # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 @@ -10565,6 +10778,10 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 1D185..1D18B ; XID_Continue # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; XID_Continue # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO 1D242..1D244 ; XID_Continue # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D250..1D252 ; XID_Continue # Mc [3] MUSICAL SYMBOL COMBINING FLAG-6..MUSICAL SYMBOL COMBINING FLAG-8 +1D25B..1D25C ; XID_Continue # Mn [2] MUSICAL SYMBOL COMBINING TREMOLO-4..MUSICAL SYMBOL COMBINING TREMOLO-5 +1D25F ; XID_Continue # Mc MUSICAL SYMBOL COMBINING BUZZ ROLL STEM +1D280..1D281 ; XID_Continue # Mc [2] MUSICAL SYMBOL COMBINING STEM BOW BEHIND BRIDGE..MUSICAL SYMBOL COMBINING STEM BOW ON TOP OF BRIDGE 1D400..1D454 ; XID_Continue # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G 1D456..1D49C ; XID_Continue # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A 1D49E..1D49F ; XID_Continue # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D @@ -10583,7 +10800,7 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 1D540..1D544 ; XID_Continue # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; XID_Continue # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; XID_Continue # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; XID_Continue # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; XID_Continue # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; XID_Continue # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; XID_Continue # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; XID_Continue # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -10604,8 +10821,10 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 1DAA1..1DAAF ; XID_Continue # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 1DF00..1DF09 ; XID_Continue # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; XID_Continue # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; XID_Continue # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; XID_Continue # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; XID_Continue # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; XID_Continue # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; XID_Continue # L& [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; XID_Continue # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E000..1E006 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; XID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -10687,16 +10906,17 @@ FFDA..FFDC ; XID_Continue # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HA 1EEAB..1EEBB ; XID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1FBF0..1FBF9 ; XID_Continue # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF ; XID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; XID_Continue # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; XID_Continue # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; XID_Continue # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; XID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; XID_Continue # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; XID_Continue # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; XID_Continue # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 149221 +# Total code points: 162081 # ================================================ @@ -10763,7 +10983,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_Point # Cn [3600] .................. -# Total code points: 10583 +# Total code points: 10671 # ================================================ @@ -9720,7 +9821,10 @@ E01F0..E0FFF ; NFKC_CF; # Cn [3600] ................ -# Total code points: 10545 +# Total code points: 10633 # ================================================ @@ -15640,7 +15829,9 @@ E01F0..E0FFF ; NFKC_SCF; # Cn [3600] .............. -# Total code points: 10583 +# Total code points: 10671 # EOF diff --git a/contrib/unicode/EastAsianWidth.txt b/contrib/unicode/EastAsianWidth.txt index 3e46eb65df2e..cfb34b1f09cc 100644 --- a/contrib/unicode/EastAsianWidth.txt +++ b/contrib/unicode/EastAsianWidth.txt @@ -1,6 +1,6 @@ -# EastAsianWidth-17.0.0.txt -# Date: 2025-07-24, 00:12:54 GMT -# © 2025 Unicode®, Inc. +# EastAsianWidth-18.0.0.txt +# Date: 2026-06-29, 15:25:05 GMT +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # @@ -244,11 +244,12 @@ 048A..04FF ; N # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE 0500..052F ; N # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; N # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING 055A..055F ; N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK 0560..0588 ; N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE 0589 ; N # Po ARMENIAN FULL STOP 058A ; N # Pd ARMENIAN HYPHEN +058B..058C ; N # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 058D..058E ; N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN 058F ; N # Sc ARMENIAN DRAM SIGN 0591..05BD ; N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG @@ -259,7 +260,7 @@ 05C3 ; N # Po HEBREW PUNCTUATION SOF PASUQ 05C4..05C5 ; N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 05C6 ; N # Po HEBREW PUNCTUATION NUN HAFUKHA -05C7 ; N # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; N # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 05D0..05EA ; N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV 05EF..05F2 ; N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD 05F3..05F4 ; N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM @@ -454,7 +455,7 @@ 0B47..0B48 ; N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI 0B4B..0B4C ; N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 0B4D ; N # Mn ORIYA SIGN VIRAMA -0B55..0B56 ; N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B53..0B56 ; N # Mn [4] ORIYA SIGN DOT ABOVE..ORIYA AI LENGTH MARK 0B57 ; N # Mc ORIYA AU LENGTH MARK 0B5C..0B5D ; N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA 0B5F..0B61 ; N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL @@ -806,8 +807,7 @@ 1AA8..1AAD ; N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG 1AB0..1ABD ; N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 1ABE ; N # Me COMBINING PARENTHESES OVERLAY -1ABF..1ADD ; N # Mn [31] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOT-AND-RING BELOW -1AE0..1AEB ; N # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1ABF..1AF0 ; N # Mn [50] COMBINING LATIN SMALL LETTER W BELOW..COMBINING DOUBLE COMMA ABOVE 1B00..1B03 ; N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 1B04 ; N # Mc BALINESE SIGN BISAH 1B05..1B33 ; N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA @@ -972,12 +972,12 @@ 208A..208C ; N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN 208D ; N # Ps SUBSCRIPT LEFT PARENTHESIS 208E ; N # Pe SUBSCRIPT RIGHT PARENTHESIS -2090..209C ; N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +208F..209F ; N # Lm [17] MODIFIER LETTER HIGH AND LOW VERTICAL LINE..LATIN SUBSCRIPT SMALL LETTER Z 20A0..20A8 ; N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN 20A9 ; H # Sc WON SIGN 20AA..20AB ; N # Sc [2] NEW SHEQEL SIGN..DONG SIGN 20AC ; A # Sc EURO SIGN -20AD..20C1 ; N # Sc [21] KIP SIGN..SAUDI RIYAL SIGN +20AD..20C4 ; N # Sc [24] KIP SIGN..OMANI RIAL SIGN 20D0..20DC ; N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1 ; N # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -1431,6 +1431,9 @@ 2E5B ; N # Ps BOTTOM HALF LEFT PARENTHESIS 2E5C ; N # Pe BOTTOM HALF RIGHT PARENTHESIS 2E5D ; N # Pd OBLIQUE HYPHEN +2E60..2E61 ; N # Po [2] WIGGLY EXCLAMATION MARK..INVERTED WIGGLY EXCLAMATION MARK +2E62 ; N # Ps LEFT PARENTHESIS WITH MIDDLE RING +2E63 ; N # Pe RIGHT PARENTHESIS WITH MIDDLE RING 2E80..2E99 ; W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3 ; W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5 ; W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1548,7 +1551,8 @@ A788 ; N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789..A78A ; N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E ; N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; N # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7DC ; N # L& [77] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER LAMBDA WITH STROKE +A790..A7DD ; N # L& [78] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER CLOSED OMEGA +A7E2 ; N # Lu LATIN CAPITAL LETTER R WITH LONG LEG A7F1..A7F4 ; N # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F7 ; N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I @@ -1670,6 +1674,7 @@ AB5C..AB5F ; N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMA AB60..AB68 ; N # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE AB69 ; N # Lm MODIFIER LETTER SMALL TURNED W AB6A..AB6B ; N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB6C..AB6D ; N # Lu [2] LATIN CAPITAL LETTER SCRIPT R..LATIN CAPITAL LETTER SCRIPT R WITH RING AB70..ABBF ; N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA ABC0..ABE2 ; N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM ABE3..ABE4 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP @@ -1880,7 +1885,7 @@ FFFD ; A # So REPLACEMENT CHARACTER 10760..10767 ; N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 10780..10785 ; N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; N # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR 10800..10805 ; N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA 10808 ; N # Lo CYPRIOT SYLLABLE JO 1080A..10835 ; N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO @@ -1966,9 +1971,12 @@ FFFD ; A # So REPLACEMENT CHARACTER 10EC2..10EC4 ; N # Lo [3] ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW 10EC5 ; N # Lm ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW 10EC6..10EC7 ; N # Lo [2] ARABIC LETTER THIN NOON..ARABIC LETTER YEH WITH FOUR DOTS BELOW +10EC9..10ECA ; N # Sk [2] ARABIC SMALL BASELINE FATHA..ARABIC SMALL BASELINE DOTLESS HEAD OF KHAH +10ECB..10ECF ; N # Mn [5] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC LARGE CIRCLE ABOVE 10ED0 ; N # Po ARABIC BIBLICAL END OF VERSE 10ED1..10ED8 ; N # So [8] ARABIC LIGATURE ALAYHAA AS-SALAATU WAS-SALAAM..ARABIC LIGATURE NAWWARA ALLAAHU MARQADAH -10EFA..10EFF ; N # Mn [6] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC SMALL LOW WORD MADDA +10ED9..10EEE ; N # Lo [22] ARABIC CROWN LETTER BEH..ARABIC CROWN LETTER YEH +10EF0..10EFF ; N # Mn [16] ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO..ARABIC SMALL LOW WORD MADDA 10F00..10F1C ; N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F1D..10F26 ; N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF 10F27 ; N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH @@ -2239,6 +2247,7 @@ FFFD ; A # So REPLACEMENT CHARACTER 11AB0..11ABF ; N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA 11AC0..11AF8 ; N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11B00..11B09 ; N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11B0A ; N # Lo DEVANAGARI LETTER ALTERNATE DDDA 11B60 ; N # Mn SHARADA VOWEL SIGN OE 11B61 ; N # Mc SHARADA VOWEL SIGN OOE 11B62..11B64 ; N # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E @@ -2293,6 +2302,8 @@ FFFD ; A # So REPLACEMENT CHARACTER 11DD9 ; N # Lm TOLONG SIKI SIGN SELA 11DDA..11DDB ; N # Lo [2] TOLONG SIKI SIGN HECAKA..TOLONG SIKI UNGGA 11DE0..11DE9 ; N # Nd [10] TOLONG SIKI DIGIT ZERO..TOLONG SIKI DIGIT NINE +11DF0 ; N # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE +11DF1 ; N # Lo BENGALI LETTER ALTERNATE BARGIYA BA 11EE0..11EF2 ; N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O @@ -2318,9 +2329,11 @@ FFFD ; A # So REPLACEMENT CHARACTER 11FE1..11FF1 ; N # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA 11FFF ; N # Po TAMIL PUNCTUATION END OF TEXT 12000..12399 ; N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12400..1246F ; N # Nl [112] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN SEVEN ASH TENU 12470..12474 ; N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12475..1247F ; N # Nl [11] CUNEIFORM NUMERIC SIGN EIGHT ASH TENU..CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU 12480..12543 ; N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12550..12686 ; N # Nl [311] CUNEIFORM NUMERIC SIGN ONE N01..CUNEIFORM NUMERIC SIGN ONE N36 FLAT 12F90..12FF0 ; N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 12FF1..12FF2 ; N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 13000..1342F ; N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D @@ -2380,19 +2393,21 @@ FFFD ; A # So REPLACEMENT CHARACTER 16FF4..16FF6 ; W # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS 17000..187FF ; W # Lo [6144] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187FF 18800..18AFF ; W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 -18B00..18CD5 ; W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18B00..18CDA ; W # Lo [475] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CDA 18CFF ; W # Lo KHITAN SMALL SCRIPT CHARACTER-18CFF -18D00..18D1E ; W # Lo [31] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D1E +18D00..18D20 ; W # Lo [33] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; W # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; W # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; W # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1AFF0..1AFF3 ; W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B0FF ; W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 -1B100..1B122 ; W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B100..1B128 ; W # Lo [41] HENTAIGANA LETTER RE-3..KATAKANA LETTER ALTERNATE WI 1B132 ; W # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO 1B155 ; W # Lo KATAKANA LETTER SMALL KO -1B164..1B167 ; W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B164..1B168 ; W # Lo [5] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL ARCHAIC YE 1B170..1B2FB ; W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -2408,13 +2423,16 @@ FFFD ; A # So REPLACEMENT CHARACTER 1CD00..1CEB3 ; N # So [436] BLOCK OCTANT-3..BLACK RIGHT TRIANGLE CARET 1CEBA..1CEBF ; N # So [6] FRAGILE SYMBOL..STRAWBERRY SYMBOL 1CEC0..1CED0 ; N # So [17] HEBE..LEUKOTHEA +1CED2..1CED4 ; N # So [3] ALCHEMICAL SYMBOL FOR OIL INVERTED..ALCHEMICAL SYMBOL FOR SALT OF TARTAR +1CEDD..1CEDF ; N # Sm [3] SQUARE ROOT OF SQUARE ROOT..SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT 1CEE0..1CEEF ; N # So [16] GEOMANTIC FIGURE POPULUS..GEOMANTIC FIGURE VIA -1CEF0 ; N # Sm MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR +1CEF0..1CEFD ; N # Sm [14] MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR..HYPERBOLA 1CF00..1CF2D ; N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT 1CF30..1CF46 ; N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG 1CF50..1CFC3 ; N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK 1D000..1D0F5 ; N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO 1D100..1D126 ; N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D127..1D128 ; N # Mn [2] MUSICAL SYMBOL COMBINING STRESS..MUSICAL SYMBOL COMBINING UNSTRESS 1D129..1D164 ; N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE 1D165..1D166 ; N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167..1D169 ; N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 @@ -2426,10 +2444,17 @@ FFFD ; A # So REPLACEMENT CHARACTER 1D185..1D18B ; N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D18C..1D1A9 ; N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH 1D1AA..1D1AD ; N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D1AE..1D1EA ; N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D1AE..1D1FF ; N # So [82] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL LONGA REST 1D200..1D241 ; N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242..1D244 ; N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 1D245 ; N # So GREEK MUSICAL LEIMMA +1D250..1D252 ; N # Mc [3] MUSICAL SYMBOL COMBINING FLAG-6..MUSICAL SYMBOL COMBINING FLAG-8 +1D253..1D25A ; N # So [8] MUSICAL SYMBOL TWO HUNDRED FIFTY-SIXTH REST..MUSICAL SYMBOL SHARP WITH STROKE +1D25B..1D25C ; N # Mn [2] MUSICAL SYMBOL COMBINING TREMOLO-4..MUSICAL SYMBOL COMBINING TREMOLO-5 +1D25D..1D25E ; N # So [2] MUSICAL SYMBOL FINGERED TREMOLO-4..MUSICAL SYMBOL FINGERED TREMOLO-5 +1D25F ; N # Mc MUSICAL SYMBOL COMBINING BUZZ ROLL STEM +1D260..1D27F ; N # So [32] MUSICAL SYMBOL TRIPLE FLAT..MUSICAL SYMBOL ARPEGGIATO UP WITH ARROW +1D280..1D281 ; N # Mc [2] MUSICAL SYMBOL COMBINING STEM BOW BEHIND BRIDGE..MUSICAL SYMBOL COMBINING STEM BOW ON TOP OF BRIDGE 1D2C0..1D2D3 ; N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN 1D2E0..1D2F3 ; N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN 1D300..1D356 ; W # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING @@ -2453,7 +2478,7 @@ FFFD ; A # So REPLACEMENT CHARACTER 1D540..1D544 ; N # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; N # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; N # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; N # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; N # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C1 ; N # Sm MATHEMATICAL BOLD NABLA 1D6C2..1D6DA ; N # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA @@ -2488,10 +2513,13 @@ FFFD ; A # So REPLACEMENT CHARACTER 1DA87..1DA8B ; N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS 1DA9B..1DA9F ; N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DB00..1DB1C ; N # Sm [29] LEIBNIZIAN EQUALS SIGN..FACIT SYMBOL 1DF00..1DF09 ; N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK -1DF0B..1DF1E ; N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL -1DF25..1DF2A ; N # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1DF0B..1DF7F ; N # L& [117] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER REVERSED U +1DF80..1DF81 ; N # Lo [2] LATIN CAPITAL LETTER A WITH TOPBAR..LATIN CAPITAL LETTER E WITH BENT TOPBAR +1DF90..1DF96 ; N # Ll [7] LATIN SMALL LETTER C WITH LOW SLASH..LATIN SMALL LETTER LONG S WITH TOP LOOP +1DFCD..1DFFF ; N # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E000..1E006 ; N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI @@ -2607,6 +2635,7 @@ FFFD ; A # So REPLACEMENT CHARACTER 1F191..1F19A ; W # So [10] SQUARED CL..SQUARED VS 1F19B..1F1AC ; A # So [18] SQUARED THREE D..SQUARED VOD 1F1AD ; N # So MASK WORK SYMBOL +1F1AE ; W # So TOMOBIKI SYMBOL 1F1E6..1F1FF ; N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z 1F200..1F202 ; W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA 1F210..1F23B ; W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D @@ -2658,7 +2687,7 @@ FFFD ; A # So REPLACEMENT CHARACTER 1F6CD..1F6CF ; N # So [3] SHOPPING BAGS..BED 1F6D0..1F6D2 ; W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY 1F6D3..1F6D4 ; N # So [2] STUPA..PAGODA -1F6D5..1F6D8 ; W # So [4] HINDU TEMPLE..LANDSLIDE +1F6D5..1F6D9 ; W # So [5] HINDU TEMPLE..LIGHTHOUSE 1F6DC..1F6DF ; W # So [4] WIRELESS..RING BUOY 1F6E0..1F6EA ; N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE 1F6EB..1F6EC ; W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING @@ -2666,8 +2695,11 @@ FFFD ; A # So REPLACEMENT CHARACTER 1F6F4..1F6FC ; W # So [9] SCOOTER..ROLLER SKATE 1F700..1F77F ; N # So [128] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ORCUS 1F780..1F7D9 ; N # So [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR +1F7DA ; W # So BLACK CIRCLE WITH WHITE VERTICAL BAR +1F7DB ; N # So BULLET IN DOUBLE CIRCLE 1F7E0..1F7EB ; W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE 1F7F0 ; W # So HEAVY EQUALS SIGN +1F7F1..1F7FF ; N # So [15] CIRCLE WITH DOUBLE VERTICAL AND HORIZONTAL LINE..RHOMBUS 1F800..1F80B ; N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD 1F810..1F847 ; N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW 1F850..1F859 ; N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW @@ -2685,20 +2717,19 @@ FFFD ; A # So REPLACEMENT CHARACTER 1FA00..1FA57 ; N # So [88] NEUTRAL CHESS KING..BLACK CHESS ALFIL 1FA60..1FA6D ; N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER 1FA70..1FA7C ; W # So [13] BALLET SHOES..CRUTCH -1FA80..1FA8A ; W # So [11] YO-YO..TROMBONE -1FA8E..1FAC6 ; W # So [57] TREASURE CHEST..FINGERPRINT +1FA80..1FAC6 ; W # So [71] YO-YO..FINGERPRINT 1FAC8 ; W # So HAIRY CREATURE -1FACD..1FADC ; W # So [16] ORCA..ROOT VEGETABLE -1FADF..1FAEA ; W # So [12] SPLATTER..DISTORTED FACE -1FAEF..1FAF8 ; W # So [10] FIGHT CLOUD..RIGHTWARDS PUSHING HAND +1FACC..1FADD ; W # So [18] MONARCH BUTTERFLY..PICKLE +1FADF..1FAEB ; W # So [13] SPLATTER..CRACKING FACE +1FAEF..1FAFA ; W # So [12] FIGHT CLOUD..RIGHTWARDS THUMB SIGN 1FB00..1FB92 ; N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBEF ; N # So [92] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE 1FBF0..1FBF9 ; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 1FBFA ; N # So ALARM BELL SYMBOL 20000..2A6DF ; W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF 2A6E0..2A6FF ; W # Cn [32] .. -2A700..2B81D ; W # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D -2B81E..2B81F ; W # Cn [2] .. +2A700..2B81E ; W # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E +2B81F ; W # Cn 2B820..2CEAD ; W # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEAE..2CEAF ; W # Cn [2] .. 2CEB0..2EBE0 ; W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 @@ -2711,7 +2742,9 @@ FFFD ; A # So REPLACEMENT CHARACTER 30000..3134A ; W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 3134B..3134F ; W # Cn [5] .. 31350..33479 ; W # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 -3347A..3FFFD ; W # Cn [52100] .. +3347A..3CFFF ; W # Cn [39814] .. +3D000..3FC3F ; W # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F +3FC40..3FFFD ; W # Cn [958] .. E0001 ; N # Cf LANGUAGE TAG E0020..E007F ; N # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 diff --git a/contrib/unicode/HangulSyllableType.txt b/contrib/unicode/HangulSyllableType.txt index 8c3cf4a73672..f04f49d2550b 100644 --- a/contrib/unicode/HangulSyllableType.txt +++ b/contrib/unicode/HangulSyllableType.txt @@ -1,6 +1,6 @@ -# HangulSyllableType-17.0.0.txt -# Date: 2025-01-27, 18:09:16 GMT -# © 2025 Unicode®, Inc. +# HangulSyllableType-18.0.0.txt +# Date: 2026-02-03, 23:09:57 GMT +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # diff --git a/contrib/unicode/NameAliases.txt b/contrib/unicode/NameAliases.txt index 09df7d666f12..dcbdcac4a66a 100644 --- a/contrib/unicode/NameAliases.txt +++ b/contrib/unicode/NameAliases.txt @@ -1,6 +1,6 @@ -# NameAliases-17.0.0.txt -# Date: 2025-04-23 -# © 2025 Unicode®, Inc. +# NameAliases-18.0.0.txt +# Date: 2026-02-03 +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # diff --git a/contrib/unicode/PropList.txt b/contrib/unicode/PropList.txt index e64b4224d727..3f1b6ec294fe 100644 --- a/contrib/unicode/PropList.txt +++ b/contrib/unicode/PropList.txt @@ -1,6 +1,6 @@ -# PropList-17.0.0.txt -# Date: 2025-06-30, 06:19:01 GMT -# © 2025 Unicode®, Inc. +# PropList-18.0.0.txt +# Date: 2026-08-07, 16:20:14 GMT +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # @@ -167,6 +167,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET 2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA 2E4E..2E4F ; Terminal_Punctuation # Po [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER 2E53..2E54 ; Terminal_Punctuation # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +2E60..2E61 ; Terminal_Punctuation # Po [2] WIGGLY EXCLAMATION MARK..INVERTED WIGGLY EXCLAMATION MARK 3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK @@ -234,7 +235,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA 1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON -# Total code points: 291 +# Total code points: 293 # ================================================ @@ -368,7 +369,7 @@ FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT 1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Other_Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D552..1D6A6 ; Other_Math # L& [341] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S 1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA 1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA 1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA @@ -414,8 +415,10 @@ FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT 1EEA1..1EEA3 ; Other_Math # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL 1EEA5..1EEA9 ; Other_Math # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; Other_Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1F7DB ; Other_Math # So BULLET IN DOUBLE CIRCLE +1F7F1..1F7FF ; Other_Math # So [15] CIRCLE WITH DOUBLE VERTICAL AND HORIZONTAL LINE..RHOMBUS -# Total code points: 1362 +# Total code points: 1379 # ================================================ @@ -444,7 +447,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE 05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; Other_Alphabetic # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 0610..061A ; Other_Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA 064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA 0659..065F ; Other_Alphabetic # Mn [7] ARABIC ZWARAKAY..ARABIC WAVY HAMZA BELOW @@ -702,6 +705,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI 10D69 ; Other_Alphabetic # Mn GARAY VOWEL SIGN E 10EAB..10EAC ; Other_Alphabetic # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10ECB..10ECD ; Other_Alphabetic # Mn [3] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC SOUTHWEST POINTING ARROWHEAD BELOW +10EF3 ; Other_Alphabetic # Mn ARABIC SMALL HIGH NOON WITH FATHA +10EF5 ; Other_Alphabetic # Mn ARABIC SMALL HIGH NOON WITH DAMMA +10EF7..10EF8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH HEH INITIAL FORM..ARABIC SMALL HIGH WORD KABBIR 10EFA..10EFC ; Other_Alphabetic # Mn [3] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC COMBINING ALEF OVERLAY 11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU 11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA @@ -837,6 +844,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU 11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA 11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA +11DF0 ; Other_Alphabetic # Mn BENGALI SIGN COMBINING ANUSVARA ABOVE 11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O 11F00..11F01 ; Other_Alphabetic # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA @@ -868,7 +876,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 1510 +# Total code points: 1520 # ================================================ @@ -883,20 +891,23 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 16FE4 ; Ideographic # Mn KHITAN SMALL SCRIPT FILLER 16FF2..16FF3 ; Ideographic # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER 16FF4..16FF6 ; Ideographic # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS -17000..18CD5 ; Ideographic # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 -18CFF..18D1E ; Ideographic # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +17000..18CDA ; Ideographic # Lo [7387] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CDA +18CFF..18D20 ; Ideographic # Lo [34] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D20 18D80..18DF2 ; Ideographic # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +18E00..19191 ; Ideographic # Lo [914] JURCHEN CHARACTER-18E00..JURCHEN CHARACTER-19191 +191A0..191D2 ; Ideographic # Lo [51] JURCHEN RADICAL-01..JURCHEN RADICAL-51 1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 20000..2A6DF ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; Ideographic # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; Ideographic # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; Ideographic # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; Ideographic # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; Ideographic # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 +3D000..3FC3F ; Ideographic # Lo [11328] SMALL SEAL CHARACTER-3D000..SMALL SEAL CHARACTER-3FC3F -# Total code points: 110943 +# Total code points: 123244 # ================================================ @@ -925,15 +936,17 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 037A ; Diacritic # Lm GREEK YPOGEGRAMMENI 0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS 0483..0487 ; Diacritic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0558..0559 ; Diacritic # Lm [2] MODIFIER LETTER ARMENIAN SMALL EH..ARMENIAN MODIFIER LETTER LEFT HALF RING +058B..058C ; Diacritic # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 0591..05BD ; Diacritic # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 05BF ; Diacritic # Mn HEBREW POINT RAFE 05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; Diacritic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Diacritic # Mn HEBREW POINT QAMATS QATAN +05C7..05C9 ; Diacritic # Mn [3] HEBREW POINT QAMATS QATAN..HEBREW POINT DAGESH HAZAQ MUDGASH 064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN -0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA +0656..0658 ; Diacritic # Mn [3] ARABIC SUBSCRIPT ALEF..ARABIC MARK NOON GHUNNA 06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E2 ; Diacritic # Mn ARABIC SMALL HIGH MEEM ISOLATED FORM 06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH 06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH @@ -943,7 +956,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 0818..0819 ; Diacritic # Mn [2] SAMARITAN MARK OCCLUSION..SAMARITAN MARK DAGESH 0898..089F ; Diacritic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA 08C9 ; Diacritic # Lm ARABIC SMALL FARSI YEH -08CA..08D2 ; Diacritic # Mn [9] ARABIC SMALL HIGH FARSI YEH..ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW +08CA..08D3 ; Diacritic # Mn [10] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL LOW WAW 08E3..08FE ; Diacritic # Mn [28] ARABIC TURNED DAMMA BELOW..ARABIC DAMMA WITH DOT 093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA 094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA @@ -958,7 +971,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 0AFD..0AFF ; Diacritic # Mn [3] GUJARATI SIGN THREE-DOT NUKTA ABOVE..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B3C ; Diacritic # Mn ORIYA SIGN NUKTA 0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA -0B55 ; Diacritic # Mn ORIYA SIGN OVERLINE +0B53..0B55 ; Diacritic # Mn [3] ORIYA SIGN DOT ABOVE..ORIYA SIGN OVERLINE 0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA 0C3C ; Diacritic # Mn TELUGU SIGN NUKTA 0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA @@ -1001,8 +1014,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 1AB0..1ABD ; Diacritic # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 1ABE ; Diacritic # Me COMBINING PARENTHESES OVERLAY 1AC1..1ACB ; Diacritic # Mn [11] COMBINING LEFT PARENTHESIS ABOVE LEFT..COMBINING TRIPLE ACUTE ACCENT -1ACF..1ADD ; Diacritic # Mn [15] COMBINING DOUBLE CARON..COMBINING DOT-AND-RING BELOW -1AE0..1AEB ; Diacritic # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1ACF..1AF0 ; Diacritic # Mn [34] COMBINING DOUBLE CARON..COMBINING DOUBLE COMMA ABOVE 1B34 ; Diacritic # Mn BALINESE SIGN REREKAN 1B44 ; Diacritic # Mc BALINESE ADEG ADEG 1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG @@ -1031,6 +1043,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI 1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA 1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA +208F ; Diacritic # Lm MODIFIER LETTER HIGH AND LOW VERTICAL LINE 2CEF..2CF1 ; Diacritic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS 2E2F ; Diacritic # Lm VERTICAL TILDE 302A..302D ; Diacritic # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK @@ -1092,7 +1105,9 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI 10D4E ; Diacritic # Lm GARAY VOWEL LENGTH MARK 10D69..10D6D ; Diacritic # Mn [5] GARAY VOWEL SIGN E..GARAY CONSONANT NASALIZATION MARK -10EFA ; Diacritic # Mn ARABIC DOUBLE VERTICAL BAR BELOW +10ECB..10ECF ; Diacritic # Mn [5] ARABIC NORTHEAST POINTING ARROWHEAD ABOVE..ARABIC LARGE CIRCLE ABOVE +10EF0..10EF7 ; Diacritic # Mn [8] ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO..ARABIC SMALL HIGH HEH INITIAL FORM +10EF9..10EFA ; Diacritic # Mn [2] ARABIC MARK CROWN..ARABIC DOUBLE VERTICAL BAR BELOW 10EFD..10EFF ; Diacritic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F82..10F85 ; Diacritic # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW @@ -1158,6 +1173,10 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE 1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D250..1D252 ; Diacritic # Mc [3] MUSICAL SYMBOL COMBINING FLAG-6..MUSICAL SYMBOL COMBINING FLAG-8 +1D25B..1D25C ; Diacritic # Mn [2] MUSICAL SYMBOL COMBINING TREMOLO-4..MUSICAL SYMBOL COMBINING TREMOLO-5 +1DFCD..1DFCF ; Diacritic # Lm [3] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL SPLIT U +1DFD1..1DFFF ; Diacritic # Lm [47] MODIFIER LETTER SMALL CAPITAL P..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; Diacritic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E130..1E136 ; Diacritic # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E2AE ; Diacritic # Mn TOTO SIGN RISING TONE @@ -1167,7 +1186,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK 1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA -# Total code points: 1247 +# Total code points: 1334 # ================================================ @@ -1177,7 +1196,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 07FA ; Extender # Lm NKO LAJANYALAN 0A71 ; Extender # Mn GURMUKHI ADDAK 0AFB ; Extender # Mn GUJARATI SIGN SHADDA -0B55 ; Extender # Mn ORIYA SIGN OVERLINE +0B54..0B55 ; Extender # Mn [2] ORIYA SIGN DOUBLE DOT ABOVE..ORIYA SIGN OVERLINE 0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK 0EC6 ; Extender # Lm LAO KO LA 180A ; Extender # Po MONGOLIAN NIRUGU @@ -1216,7 +1235,7 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND 1E5EF ; Extender # Mn OL ONAL SIGN IKIR 1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK -# Total code points: 62 +# Total code points: 63 # ================================================ @@ -1227,13 +1246,15 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND 02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP 0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI 037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI +0558 ; Other_Lowercase # Lm MODIFIER LETTER ARMENIAN SMALL EH +058B..058C ; Other_Lowercase # Lm [2] MODIFIER LETTER ARMENIAN SMALL INI..MODIFIER LETTER ARMENIAN SMALL YI 10FC ; Other_Lowercase # Lm MODIFIER LETTER GEORGIAN NAR 1D2C..1D6A ; Other_Lowercase # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI 1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN 1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA 2071 ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER I 207F ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Other_Lowercase # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2090..209F ; Other_Lowercase # Lm [16] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER Z 2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND 24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z 2C7C..2C7D ; Other_Lowercase # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V @@ -1246,10 +1267,11 @@ AB69 ; Other_Lowercase # Lm MODIFIER LETTER SMALL TURNED W 10780 ; Other_Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA 10783..10785 ; Other_Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Other_Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK -107B2..107BA ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +107B2..107BF ; Other_Lowercase # Lm [14] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL ESH WITH DOUBLE BAR +1DFCD..1DFFF ; Other_Lowercase # Lm [51] MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK..MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK 1E030..1E06D ; Other_Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE -# Total code points: 312 +# Total code points: 374 # ================================================ @@ -1334,9 +1356,12 @@ FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND 16FF0..16FF1 ; Other_Grapheme_Extend # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 1D165..1D166 ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D16D..1D172 ; Other_Grapheme_Extend # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D250..1D252 ; Other_Grapheme_Extend # Mc [3] MUSICAL SYMBOL COMBINING FLAG-6..MUSICAL SYMBOL COMBINING FLAG-8 +1D25F ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING BUZZ ROLL STEM +1D280..1D281 ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING STEM BOW BEHIND BRIDGE..MUSICAL SYMBOL COMBINING STEM BOW ON TOP OF BRIDGE E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 160 +# Total code points: 166 # ================================================ @@ -1378,14 +1403,14 @@ FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21 FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 20000..2A6DF ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B81D ; Unified_Ideograph # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2A700..2B81E ; Unified_Ideograph # Lo [4383] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81E 2B820..2CEAD ; Unified_Ideograph # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD 2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2EBF0..2EE5D ; Unified_Ideograph # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D 30000..3134A ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A 31350..33479 ; Unified_Ideograph # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 -# Total code points: 101996 +# Total code points: 101997 # ================================================ @@ -1451,10 +1476,12 @@ E0001 ; Deprecated # Cf LANGUAGE TAG 1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J 1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J 1DF1A ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK +1DF6F..1DF71 ; Soft_Dotted # L& [3] LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI..LATIN SMALL LETTER STRETCHED I +1DFD9 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH STROKE 1E04C..1E04D ; Soft_Dotted # Lm [2] MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I..MODIFIER LETTER CYRILLIC SMALL JE 1E068 ; Soft_Dotted # Lm CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I -# Total code points: 50 +# Total code points: 54 # ================================================ @@ -1573,6 +1600,7 @@ FF65 ; Other_ID_Continue # Po HALFWIDTH KATAKANA MIDDLE DOT 2E2E ; Sentence_Terminal # Po REVERSED QUESTION MARK 2E3C ; Sentence_Terminal # Po STENOGRAPHIC FULL STOP 2E53..2E54 ; Sentence_Terminal # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +2E60..2E61 ; Sentence_Terminal # Po [2] WIGGLY EXCLAMATION MARK..INVERTED WIGGLY EXCLAMATION MARK 3002 ; Sentence_Terminal # Po IDEOGRAPHIC FULL STOP A4FF ; Sentence_Terminal # Po LISU PUNCTUATION FULL STOP A60E..A60F ; Sentence_Terminal # Po [2] VAI FULL STOP..VAI QUESTION MARK @@ -1627,7 +1655,7 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP 1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP -# Total code points: 170 +# Total code points: 172 # ================================================ @@ -1877,7 +1905,11 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 2E5B ; Pattern_Syntax # Ps BOTTOM HALF LEFT PARENTHESIS 2E5C ; Pattern_Syntax # Pe BOTTOM HALF RIGHT PARENTHESIS 2E5D ; Pattern_Syntax # Pd OBLIQUE HYPHEN -2E5E..2E7F ; Pattern_Syntax # Cn [34] .. +2E5E..2E5F ; Pattern_Syntax # Cn [2] .. +2E60..2E61 ; Pattern_Syntax # Po [2] WIGGLY EXCLAMATION MARK..INVERTED WIGGLY EXCLAMATION MARK +2E62 ; Pattern_Syntax # Ps LEFT PARENTHESIS WITH MIDDLE RING +2E63 ; Pattern_Syntax # Pe RIGHT PARENTHESIS WITH MIDDLE RING +2E64..2E7F ; Pattern_Syntax # Cn [28] .. 3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK 3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET 3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET @@ -1938,7 +1970,10 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT 08CD..08CF ; Modifier_Combining_Mark # Mn [3] ARABIC SMALL HIGH ZAH..ARABIC LARGE ROUND DOT BELOW 08D3 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW WAW 08F3 ; Modifier_Combining_Mark # Mn ARABIC SMALL HIGH WAW +10EF4 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW NOON WITH FATHA +10EF6 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW NOON WITH DAMMA +10EF9 ; Modifier_Combining_Mark # Mn ARABIC MARK CROWN -# Total code points: 14 +# Total code points: 17 # EOF diff --git a/contrib/unicode/README b/contrib/unicode/README index dbcbb481f495..40eb51b0c43e 100644 --- a/contrib/unicode/README +++ b/contrib/unicode/README @@ -47,14 +47,14 @@ produce ucnid.h. The procedure to update GCC's Unicode support is the following: -1. Update the six Unicode data files from the above URLs. +1. Update the ten Unicode data files from the above URLs. 2. Update the two glibc files in from_glibc/ from glibc's git. Update the commit number above in this README. 3. Run ./gen_wcwidth.py X.Y > ../../libcpp/generated_cpp_wcwidth.h (where X.Y is the version of the Unicode standard corresponding to the - Unicode data files being used, most recently, 17.0.0). + Unicode data files being used, most recently, 18.0.0). 4. Update Unicode Copyright years in libcpp/makeucnid.cc and in libcpp/makeuname2c.cc up to the year in which the Unicode @@ -69,7 +69,7 @@ The procedure to update GCC's Unicode support is the following: PropList.txt > ../../libcpp/ucnid.h 7. Read the corresponding Unicode's standard and update correspondingly - generated_ranges table in libcpp/makeuname2c.cc (in Unicode 17 all + generated_ranges table in libcpp/makeuname2c.cc (in Unicode 18 all the needed information was in Table 4-8). 8. Compile makeuname2c, e.g. with: diff --git a/contrib/unicode/UnicodeData.txt b/contrib/unicode/UnicodeData.txt index fca68e3e154e..ebccf021c4fc 100644 --- a/contrib/unicode/UnicodeData.txt +++ b/contrib/unicode/UnicodeData.txt @@ -629,12 +629,12 @@ 0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; 0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F 0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; -0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;A7DD;;A7DD 0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; 0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; 027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; 027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; -027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;A7E2;;A7E2 027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; @@ -1355,6 +1355,7 @@ 0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; 0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; 0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0558;MODIFIER LETTER ARMENIAN SMALL EH;Lm;0;L; 0567;;;;N;;;;; 0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; 055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; 055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; @@ -1405,6 +1406,8 @@ 0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;; 0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; 058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058B;MODIFIER LETTER ARMENIAN SMALL INI;Lm;0;L; 056B;;;;N;;;;; +058C;MODIFIER LETTER ARMENIAN SMALL YI;Lm;0;L; 0575;;;;N;;;;; 058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; 058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; 058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; @@ -1463,6 +1466,8 @@ 05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; 05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; 05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05C8;HEBREW POINT SHEVA NA MUDGASH;Mn;10;NSM;;;;;N;;;;; +05C9;HEBREW POINT DAGESH HAZAQ MUDGASH;Mn;21;NSM;;;;;N;;;;; 05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; 05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; 05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; @@ -2687,6 +2692,8 @@ 0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; 0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; 0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B53;ORIYA SIGN DOT ABOVE;Mn;0;NSM;;;;;N;;;;; +0B54;ORIYA SIGN DOUBLE DOT ABOVE;Mn;0;NSM;;;;;N;;;;; 0B55;ORIYA SIGN OVERLINE;Mn;0;NSM;;;;;N;;;;; 0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; 0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; @@ -6155,6 +6162,8 @@ 1ADB;COMBINING DOWN TACK ABOVE;Mn;230;NSM;;;;;N;;;;; 1ADC;COMBINING DIAERESIS WITH RAISED LEFT DOT;Mn;230;NSM;;;;;N;;;;; 1ADD;COMBINING DOT-AND-RING BELOW;Mn;220;NSM;;;;;N;;;;; +1ADE;COMBINING GRAVE-DOT;Mn;230;NSM;;;;;N;;;;; +1ADF;COMBINING DOT-ACUTE;Mn;230;NSM;;;;;N;;;;; 1AE0;COMBINING LEFT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; 1AE1;COMBINING RIGHT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; 1AE2;COMBINING MINUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; @@ -6167,6 +6176,11 @@ 1AE9;COMBINING LEFT ANGLE CENTRED ABOVE;Mn;230;NSM;;;;;N;;;;; 1AEA;COMBINING UPWARDS ARROW ABOVE;Mn;230;NSM;;;;;N;;;;; 1AEB;COMBINING DOUBLE RIGHTWARDS ARROW ABOVE;Mn;234;NSM;;;;;N;;;;; +1AEC;COMBINING CARON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AED;COMBINING VERTICAL-LINE-DOUBLE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AEE;COMBINING DOUBLE GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;;;;; +1AEF;COMBINING DOUBLE ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;;;;; +1AF0;COMBINING DOUBLE COMMA ABOVE;Mn;230;NSM;;;;;N;;;;; 1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; 1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; 1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; @@ -6225,15 +6239,15 @@ 1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; 1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; 1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; -1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;L;;;;;N;;;;; 1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; -1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;L;;;;;N;;;;; 1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; 1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; 1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; 1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; 1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; -1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;L;;;;;N;;;;; 1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; 1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; 1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; @@ -7529,6 +7543,7 @@ 208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; 208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; 208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +208F;MODIFIER LETTER HIGH AND LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; 2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; 2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; 2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; @@ -7542,6 +7557,9 @@ 209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; 209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; 209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; +209D;LATIN SUBSCRIPT SMALL LETTER W;Lm;0;L; 0077;;;;N;;;;; +209E;LATIN SUBSCRIPT SMALL LETTER Y;Lm;0;L; 0079;;;;N;;;;; +209F;LATIN SUBSCRIPT SMALL LETTER Z;Lm;0;L; 007A;;;;N;;;;; 20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; 20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; 20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; @@ -7576,6 +7594,9 @@ 20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; 20C0;SOM SIGN;Sc;0;ET;;;;;N;;;;; 20C1;SAUDI RIYAL SIGN;Sc;0;ET;;;;;N;;;;; +20C2;RUFIYAA SIGN;Sc;0;ET;;;;;N;;;;; +20C3;UAE DIRHAM SIGN;Sc;0;ET;;;;;N;;;;; +20C4;OMANI RIAL SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -10931,6 +10952,10 @@ 2E5B;BOTTOM HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; 2E5C;BOTTOM HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; 2E5D;OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E60;WIGGLY EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +2E61;INVERTED WIGGLY EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +2E62;LEFT PARENTHESIS WITH MIDDLE RING;Ps;0;ON;;;;;Y;;;;; +2E63;RIGHT PARENTHESIS WITH MIDDLE RING;Pe;0;ON;;;;;Y;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -14321,6 +14346,8 @@ A7D9;LATIN SMALL LETTER SIGMOID S;Ll;0;L;;;;;N;;;A7D8;;A7D8 A7DA;LATIN CAPITAL LETTER LAMBDA;Lu;0;L;;;;;N;;;;A7DB; A7DB;LATIN SMALL LETTER LAMBDA;Ll;0;L;;;;;N;;;A7DA;;A7DA A7DC;LATIN CAPITAL LETTER LAMBDA WITH STROKE;Lu;0;L;;;;;N;;;;019B; +A7DD;LATIN CAPITAL LETTER CLOSED OMEGA;Lu;0;L;;;;;N;;;;0277; +A7E2;LATIN CAPITAL LETTER R WITH LONG LEG;Lu;0;L;;;;;N;;;;027C; A7F1;MODIFIER LETTER CAPITAL S;Lm;0;L; 0053;;;;N;;;;; A7F2;MODIFIER LETTER CAPITAL C;Lm;0;L; 0043;;;;N;;;;; A7F3;MODIFIER LETTER CAPITAL F;Lm;0;L; 0046;;;;N;;;;; @@ -15066,8 +15093,8 @@ AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; -AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;AB6C;;AB6C +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;AB6D;;AB6D AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; @@ -15099,6 +15126,8 @@ AB68;LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; AB69;MODIFIER LETTER SMALL TURNED W;Lm;0;L; 028D;;;;N;;;;; AB6A;MODIFIER LETTER LEFT TACK;Sk;0;ON;;;;;N;;;;; AB6B;MODIFIER LETTER RIGHT TACK;Sk;0;ON;;;;;N;;;;; +AB6C;LATIN CAPITAL LETTER SCRIPT R;Lu;0;L;;;;;N;;;;AB4B; +AB6D;LATIN CAPITAL LETTER SCRIPT R WITH RING;Lu;0;L;;;;;N;;;;AB4C; AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 @@ -18530,6 +18559,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 107B8;MODIFIER LETTER ALVEOLAR CLICK;Lm;0;L; 01C2;;;;N;;;;; 107B9;MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lm;0;L; 1DF0A;;;;N;;;;; 107BA;MODIFIER LETTER SMALL S WITH CURL;Lm;0;L; 1DF1E;;;;N;;;;; +107BB;MODIFIER LETTER SMALL TURNED T;Lm;0;L; 0287;;;;N;;;;; +107BC;MODIFIER LETTER INVERTED GLOTTAL STOP;Lm;0;L; 0296;;;;N;;;;; +107BD;MODIFIER LETTER STRETCHED C;Lm;0;L; 0297;;;;N;;;;; +107BE;MODIFIER LETTER SMALL TURNED K;Lm;0;L; 029E;;;;N;;;;; +107BF;MODIFIER LETTER SMALL ESH WITH DOUBLE BAR;Lm;0;L; 1DF0B;;;;N;;;;; 10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; 10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; 10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; @@ -19632,6 +19666,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10EC5;ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW;Lm;0;AL;;;;;N;;;;; 10EC6;ARABIC LETTER THIN NOON;Lo;0;AL;;;;;N;;;;; 10EC7;ARABIC LETTER YEH WITH FOUR DOTS BELOW;Lo;0;AL;;;;;N;;;;; +10EC9;ARABIC SMALL BASELINE FATHA;Sk;0;AL;;;;;N;;;;; +10ECA;ARABIC SMALL BASELINE DOTLESS HEAD OF KHAH;Sk;0;AL;;;;;N;;;;; +10ECB;ARABIC NORTHEAST POINTING ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +10ECC;ARABIC NORTHEAST POINTING ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +10ECD;ARABIC SOUTHWEST POINTING ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +10ECE;ARABIC SMALL CIRCLE ABOVE;Mn;230;NSM;;;;;N;;;;; +10ECF;ARABIC LARGE CIRCLE ABOVE;Mn;230;NSM;;;;;N;;;;; 10ED0;ARABIC BIBLICAL END OF VERSE;Po;0;ON;;;;;N;;;;; 10ED1;ARABIC LIGATURE ALAYHAA AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; 10ED2;ARABIC LIGATURE ALAYHIM AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; @@ -19641,6 +19682,38 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10ED6;ARABIC LIGATURE QUDDISA SIRRUHUMAA;So;0;ON;;;;;N;;;;; 10ED7;ARABIC LIGATURE QUDDISAT ASRAARUHUM;So;0;ON;;;;;N;;;;; 10ED8;ARABIC LIGATURE NAWWARA ALLAAHU MARQADAH;So;0;ON;;;;;N;;;;; +10ED9;ARABIC CROWN LETTER BEH;Lo;0;AL;;;;;N;;;;; +10EDA;ARABIC CROWN LETTER PEH;Lo;0;AL;;;;;N;;;;; +10EDB;ARABIC CROWN LETTER TEH;Lo;0;AL;;;;;N;;;;; +10EDC;ARABIC CROWN LETTER THEH;Lo;0;AL;;;;;N;;;;; +10EDD;ARABIC CROWN LETTER JEEM;Lo;0;AL;;;;;N;;;;; +10EDE;ARABIC CROWN LETTER HAH;Lo;0;AL;;;;;N;;;;; +10EDF;ARABIC CROWN LETTER KHAH;Lo;0;AL;;;;;N;;;;; +10EE0;ARABIC CROWN LETTER SEEN;Lo;0;AL;;;;;N;;;;; +10EE1;ARABIC CROWN LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +10EE2;ARABIC CROWN LETTER SAD;Lo;0;AL;;;;;N;;;;; +10EE3;ARABIC CROWN LETTER DAD;Lo;0;AL;;;;;N;;;;; +10EE4;ARABIC CROWN LETTER TAH;Lo;0;AL;;;;;N;;;;; +10EE5;ARABIC CROWN LETTER ZAH;Lo;0;AL;;;;;N;;;;; +10EE6;ARABIC CROWN LETTER AIN;Lo;0;AL;;;;;N;;;;; +10EE7;ARABIC CROWN LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +10EE8;ARABIC CROWN LETTER FEH;Lo;0;AL;;;;;N;;;;; +10EE9;ARABIC CROWN LETTER QAF;Lo;0;AL;;;;;N;;;;; +10EEA;ARABIC CROWN LETTER KAF;Lo;0;AL;;;;;N;;;;; +10EEB;ARABIC CROWN LETTER MEEM;Lo;0;AL;;;;;N;;;;; +10EEC;ARABIC CROWN LETTER NOON;Lo;0;AL;;;;;N;;;;; +10EED;ARABIC CROWN LETTER HEH;Lo;0;AL;;;;;N;;;;; +10EEE;ARABIC CROWN LETTER YEH;Lo;0;AL;;;;;N;;;;; +10EF0;ARABIC SMALL LOW UPRIGHT RECTANGULAR ZERO;Mn;220;NSM;;;;;N;;;;; +10EF1;ARABIC SQUARE BELOW;Mn;220;NSM;;;;;N;;;;; +10EF2;ARABIC FILLED SQUARE BELOW;Mn;220;NSM;;;;;N;;;;; +10EF3;ARABIC SMALL HIGH NOON WITH FATHA;Mn;230;NSM;;;;;N;;;;; +10EF4;ARABIC SMALL LOW NOON WITH FATHA;Mn;220;NSM;;;;;N;;;;; +10EF5;ARABIC SMALL HIGH NOON WITH DAMMA;Mn;230;NSM;;;;;N;;;;; +10EF6;ARABIC SMALL LOW NOON WITH DAMMA;Mn;220;NSM;;;;;N;;;;; +10EF7;ARABIC SMALL HIGH HEH INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +10EF8;ARABIC SMALL HIGH WORD KABBIR;Mn;230;NSM;;;;;N;;;;; +10EF9;ARABIC MARK CROWN;Mn;230;NSM;;;;;N;;;;; 10EFA;ARABIC DOUBLE VERTICAL BAR BELOW;Mn;220;NSM;;;;;N;;;;; 10EFB;ARABIC SMALL LOW NOON;Mn;220;NSM;;;;;N;;;;; 10EFC;ARABIC COMBINING ALEF OVERLAY;Mn;0;NSM;;;;;N;;;;; @@ -21623,6 +21696,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11B07;DEVANAGARI SIGN WESTERN NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; 11B08;DEVANAGARI SIGN REVERSED NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; 11B09;DEVANAGARI SIGN MINDU;Po;0;L;;;;;N;;;;; +11B0A;DEVANAGARI LETTER ALTERNATE DDDA;Lo;0;L;;;;;N;;;;; 11B60;SHARADA VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; 11B61;SHARADA VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; 11B62;SHARADA VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; @@ -22032,6 +22106,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11DE7;TOLONG SIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 11DE8;TOLONG SIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 11DE9;TOLONG SIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11DF0;BENGALI SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +11DF1;BENGALI LETTER ALTERNATE BARGIYA BA;Lo;0;L;;;;;N;;;;; 11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;; 11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;; 11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;; @@ -23229,11 +23305,23 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; 1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; 1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +1246F;CUNEIFORM NUMERIC SIGN SEVEN ASH TENU;Nl;0;L;;;;7;N;;;;; 12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; 12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; 12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; 12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12475;CUNEIFORM NUMERIC SIGN EIGHT ASH TENU;Nl;0;L;;;;8;N;;;;; +12476;CUNEIFORM NUMERIC SIGN NINE ASH TENU;Nl;0;L;;;;9;N;;;;; +12477;CUNEIFORM NUMERIC SIGN ASH TIMES ONE DISH TENU;Nl;0;L;;;;1;N;;;;; +12478;CUNEIFORM NUMERIC SIGN ASH TIMES TWO DISH TENU;Nl;0;L;;;;2;N;;;;; +12479;CUNEIFORM NUMERIC SIGN ASH TIMES THREE DISH TENU;Nl;0;L;;;;3;N;;;;; +1247A;CUNEIFORM NUMERIC SIGN ASH TIMES FOUR DISH TENU;Nl;0;L;;;;4;N;;;;; +1247B;CUNEIFORM NUMERIC SIGN ASH TIMES FIVE DISH TENU;Nl;0;L;;;;5;N;;;;; +1247C;CUNEIFORM NUMERIC SIGN ASH TIMES SIX DISH TENU;Nl;0;L;;;;6;N;;;;; +1247D;CUNEIFORM NUMERIC SIGN ASH TIMES SEVEN DISH TENU;Nl;0;L;;;;7;N;;;;; +1247E;CUNEIFORM NUMERIC SIGN ASH TIMES EIGHT DISH TENU;Nl;0;L;;;;8;N;;;;; +1247F;CUNEIFORM NUMERIC SIGN ASH TIMES NINE DISH TENU;Nl;0;L;;;;9;N;;;;; 12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; 12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; 12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; @@ -23430,6 +23518,317 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; 12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; 12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; +12550;CUNEIFORM NUMERIC SIGN ONE N01;Nl;0;L;;;;1;N;;;;; +12551;CUNEIFORM NUMERIC SIGN TWO N01;Nl;0;L;;;;2;N;;;;; +12552;CUNEIFORM NUMERIC SIGN THREE N01;Nl;0;L;;;;3;N;;;;; +12553;CUNEIFORM NUMERIC SIGN FOUR N01;Nl;0;L;;;;4;N;;;;; +12554;CUNEIFORM NUMERIC SIGN FIVE N01;Nl;0;L;;;;5;N;;;;; +12555;CUNEIFORM NUMERIC SIGN SIX N01;Nl;0;L;;;;6;N;;;;; +12556;CUNEIFORM NUMERIC SIGN SEVEN N01;Nl;0;L;;;;7;N;;;;; +12557;CUNEIFORM NUMERIC SIGN EIGHT N01;Nl;0;L;;;;8;N;;;;; +12558;CUNEIFORM NUMERIC SIGN NINE N01;Nl;0;L;;;;9;N;;;;; +12559;CUNEIFORM NUMERIC SIGN ONE N08;Nl;0;L;;;;1;N;;;;; +1255A;CUNEIFORM NUMERIC SIGN TWO N08;Nl;0;L;;;;2;N;;;;; +1255B;CUNEIFORM NUMERIC SIGN THREE N08;Nl;0;L;;;;3;N;;;;; +1255C;CUNEIFORM NUMERIC SIGN FOUR N08;Nl;0;L;;;;4;N;;;;; +1255D;CUNEIFORM NUMERIC SIGN FIVE N08;Nl;0;L;;;;5;N;;;;; +1255E;CUNEIFORM NUMERIC SIGN SIX N08;Nl;0;L;;;;6;N;;;;; +1255F;CUNEIFORM NUMERIC SIGN SEVEN N08;Nl;0;L;;;;7;N;;;;; +12560;CUNEIFORM NUMERIC SIGN EIGHT N08;Nl;0;L;;;;8;N;;;;; +12561;CUNEIFORM NUMERIC SIGN NINE N08;Nl;0;L;;;;9;N;;;;; +12562;CUNEIFORM NUMERIC SIGN ONE N14;Nl;0;L;;;;1;N;;;;; +12563;CUNEIFORM NUMERIC SIGN TWO N14;Nl;0;L;;;;2;N;;;;; +12564;CUNEIFORM NUMERIC SIGN THREE N14;Nl;0;L;;;;3;N;;;;; +12565;CUNEIFORM NUMERIC SIGN FOUR N14;Nl;0;L;;;;4;N;;;;; +12566;CUNEIFORM NUMERIC SIGN FIVE N14;Nl;0;L;;;;5;N;;;;; +12567;CUNEIFORM NUMERIC SIGN SIX N14;Nl;0;L;;;;6;N;;;;; +12568;CUNEIFORM NUMERIC SIGN SEVEN N14;Nl;0;L;;;;7;N;;;;; +12569;CUNEIFORM NUMERIC SIGN EIGHT N14;Nl;0;L;;;;8;N;;;;; +1256A;CUNEIFORM NUMERIC SIGN NINE N14;Nl;0;L;;;;9;N;;;;; +1256B;CUNEIFORM NUMERIC SIGN ONE N34;Nl;0;L;;;;1;N;;;;; +1256C;CUNEIFORM NUMERIC SIGN TWO N34;Nl;0;L;;;;2;N;;;;; +1256D;CUNEIFORM NUMERIC SIGN THREE N34;Nl;0;L;;;;3;N;;;;; +1256E;CUNEIFORM NUMERIC SIGN FOUR N34;Nl;0;L;;;;4;N;;;;; +1256F;CUNEIFORM NUMERIC SIGN FIVE N34;Nl;0;L;;;;5;N;;;;; +12570;CUNEIFORM NUMERIC SIGN SIX N34;Nl;0;L;;;;6;N;;;;; +12571;CUNEIFORM NUMERIC SIGN SEVEN N34;Nl;0;L;;;;7;N;;;;; +12572;CUNEIFORM NUMERIC SIGN EIGHT N34;Nl;0;L;;;;8;N;;;;; +12573;CUNEIFORM NUMERIC SIGN NINE N34;Nl;0;L;;;;9;N;;;;; +12574;CUNEIFORM NUMERIC SIGN ONE N48;Nl;0;L;;;;1;N;;;;; +12575;CUNEIFORM NUMERIC SIGN TWO N48;Nl;0;L;;;;2;N;;;;; +12576;CUNEIFORM NUMERIC SIGN THREE N48;Nl;0;L;;;;3;N;;;;; +12577;CUNEIFORM NUMERIC SIGN FOUR N48;Nl;0;L;;;;4;N;;;;; +12578;CUNEIFORM NUMERIC SIGN FIVE N48;Nl;0;L;;;;5;N;;;;; +12579;CUNEIFORM NUMERIC SIGN ONE N45;Nl;0;L;;;;1;N;;;;; +1257A;CUNEIFORM NUMERIC SIGN TWO N45;Nl;0;L;;;;2;N;;;;; +1257B;CUNEIFORM NUMERIC SIGN THREE N45;Nl;0;L;;;;3;N;;;;; +1257C;CUNEIFORM NUMERIC SIGN FOUR N45;Nl;0;L;;;;4;N;;;;; +1257D;CUNEIFORM NUMERIC SIGN FIVE N45;Nl;0;L;;;;5;N;;;;; +1257E;CUNEIFORM NUMERIC SIGN SIX N45;Nl;0;L;;;;6;N;;;;; +1257F;CUNEIFORM NUMERIC SIGN SEVEN N45;Nl;0;L;;;;7;N;;;;; +12580;CUNEIFORM NUMERIC SIGN EIGHT N45;Nl;0;L;;;;8;N;;;;; +12581;CUNEIFORM NUMERIC SIGN NINE N45;Nl;0;L;;;;9;N;;;;; +12582;CUNEIFORM NUMERIC SIGN ONE N50;Nl;0;L;;;;1;N;;;;; +12583;CUNEIFORM NUMERIC SIGN TWO N50;Nl;0;L;;;;2;N;;;;; +12584;CUNEIFORM NUMERIC SIGN THREE N50;Nl;0;L;;;;3;N;;;;; +12585;CUNEIFORM NUMERIC SIGN FOUR N50;Nl;0;L;;;;4;N;;;;; +12586;CUNEIFORM NUMERIC SIGN FIVE N50;Nl;0;L;;;;5;N;;;;; +12587;CUNEIFORM NUMERIC SIGN ONE EIGHTH IKU CURVED;Nl;0;L;;;;1/8;N;;;;; +12588;CUNEIFORM NUMERIC SIGN ONE EIGHTH IKU CURVED VARIANT FORM;Nl;0;L;;;;1/8;N;;;;; +12589;CUNEIFORM NUMERIC SIGN ONE N01 REVERSED;Nl;0;L;;;;1/4;N;;;;; +1258A;CUNEIFORM NUMERIC SIGN ONE QUARTER IKU CURVED VARIANT FORM;Nl;0;L;;;;1/4;N;;;;; +1258B;CUNEIFORM NUMERIC SIGN ONE HALF IKU CURVED VARIANT FORM;Nl;0;L;;;;1/2;N;;;;; +1258C;CUNEIFORM NUMERIC SIGN ONE N22;Nl;0;L;;;;1;N;;;;; +1258D;CUNEIFORM NUMERIC SIGN TWO N22;Nl;0;L;;;;2;N;;;;; +1258E;CUNEIFORM NUMERIC SIGN ONE BURU CURVED;Nl;0;L;;;;1;N;;;;; +1258F;CUNEIFORM NUMERIC SIGN TWO BURU CURVED;Nl;0;L;;;;2;N;;;;; +12590;CUNEIFORM NUMERIC SIGN THREE BURU CURVED;Nl;0;L;;;;3;N;;;;; +12591;CUNEIFORM NUMERIC SIGN FOUR BURU CURVED;Nl;0;L;;;;4;N;;;;; +12592;CUNEIFORM NUMERIC SIGN FIVE BURU CURVED;Nl;0;L;;;;5;N;;;;; +12593;CUNEIFORM NUMERIC SIGN ONE BAN2 CURVED;Nl;0;L;;;;1;N;;;;; +12594;CUNEIFORM NUMERIC SIGN TWO BAN2 CURVED;Nl;0;L;;;;2;N;;;;; +12595;CUNEIFORM NUMERIC SIGN THREE BAN2 CURVED;Nl;0;L;;;;3;N;;;;; +12596;CUNEIFORM NUMERIC SIGN FOUR BAN2 CURVED;Nl;0;L;;;;4;N;;;;; +12597;CUNEIFORM NUMERIC SIGN FIVE BAN2 CURVED;Nl;0;L;;;;5;N;;;;; +12598;CUNEIFORM NUMERIC SIGN NINDA2 TIMES SHE PLUS ONE ASH CURVED;Nl;0;L;;;;1/3;N;;;;; +12599;CUNEIFORM NUMERIC SIGN NINDA2 TIMES SHE PLUS TWO ASH CURVED;Nl;0;L;;;;2/3;N;;;;; +1259A;CUNEIFORM NUMERIC SIGN ONE N51;Nl;0;L;;;;1;N;;;;; +1259B;CUNEIFORM NUMERIC SIGN TWO N51;Nl;0;L;;;;2;N;;;;; +1259C;CUNEIFORM NUMERIC SIGN THREE N51;Nl;0;L;;;;3;N;;;;; +1259D;CUNEIFORM NUMERIC SIGN FOUR N51;Nl;0;L;;;;4;N;;;;; +1259E;CUNEIFORM NUMERIC SIGN FIVE N51;Nl;0;L;;;;5;N;;;;; +1259F;CUNEIFORM NUMERIC SIGN SIX N51;Nl;0;L;;;;6;N;;;;; +125A0;CUNEIFORM NUMERIC SIGN SEVEN N51;Nl;0;L;;;;7;N;;;;; +125A1;CUNEIFORM NUMERIC SIGN EIGHT N51;Nl;0;L;;;;8;N;;;;; +125A2;CUNEIFORM NUMERIC SIGN NINE N51;Nl;0;L;;;;9;N;;;;; +125A3;CUNEIFORM NUMERIC SIGN ONE N54;Nl;0;L;;;;1;N;;;;; +125A4;CUNEIFORM NUMERIC SIGN TWO N54;Nl;0;L;;;;2;N;;;;; +125A5;CUNEIFORM NUMERIC SIGN THREE N54;Nl;0;L;;;;3;N;;;;; +125A6;CUNEIFORM NUMERIC SIGN FOUR N54;Nl;0;L;;;;4;N;;;;; +125A7;CUNEIFORM NUMERIC SIGN FIVE N54;Nl;0;L;;;;5;N;;;;; +125A8;CUNEIFORM NUMERIC SIGN ONE N56;Nl;0;L;;;;1;N;;;;; +125A9;CUNEIFORM NUMERIC SIGN TWO N56;Nl;0;L;;;;2;N;;;;; +125AA;CUNEIFORM NUMERIC SIGN ONE N24;Nl;0;L;;;;1;N;;;;; +125AB;CUNEIFORM NUMERIC SIGN ONE N26;Nl;0;L;;;;1;N;;;;; +125AC;CUNEIFORM NUMERIC SIGN ONE N28;Nl;0;L;;;;1;N;;;;; +125AD;CUNEIFORM NUMERIC SIGN ONE N29A;Nl;0;L;;;;1;N;;;;; +125AE;CUNEIFORM NUMERIC SIGN ONE N29B;Nl;0;L;;;;1;N;;;;; +125AF;CUNEIFORM NUMERIC SIGN ONE N30A;Nl;0;L;;;;1;N;;;;; +125B0;CUNEIFORM NUMERIC SIGN ONE N30C;Nl;0;L;;;;1;N;;;;; +125B1;CUNEIFORM NUMERIC SIGN ONE N30D;Nl;0;L;;;;1;N;;;;; +125B2;CUNEIFORM NUMERIC SIGN ONE N30E;Nl;0;L;;;;1;N;;;;; +125B3;CUNEIFORM NUMERIC SIGN ONE N31;Nl;0;L;;;;1;N;;;;; +125B4;CUNEIFORM NUMERIC SIGN ONE N32;Nl;0;L;;;;1;N;;;;; +125B5;CUNEIFORM NUMERIC SIGN ONE N33;Nl;0;L;;;;1;N;;;;; +125B6;CUNEIFORM NUMERIC SIGN ONE N39A;Nl;0;L;;;;1;N;;;;; +125B7;CUNEIFORM NUMERIC SIGN TWO N39A;Nl;0;L;;;;2;N;;;;; +125B8;CUNEIFORM NUMERIC SIGN THREE N39A;Nl;0;L;;;;3;N;;;;; +125B9;CUNEIFORM NUMERIC SIGN FOUR N39A;Nl;0;L;;;;4;N;;;;; +125BA;CUNEIFORM NUMERIC SIGN ONE N39B;Nl;0;L;;;;1;N;;;;; +125BB;CUNEIFORM NUMERIC SIGN TWO N39B;Nl;0;L;;;;2;N;;;;; +125BC;CUNEIFORM NUMERIC SIGN THREE N39B;Nl;0;L;;;;3;N;;;;; +125BD;CUNEIFORM NUMERIC SIGN FOUR N39B;Nl;0;L;;;;4;N;;;;; +125BE;CUNEIFORM NUMERIC SIGN ONE N02;Nl;0;L;;;;1;N;;;;; +125BF;CUNEIFORM NUMERIC SIGN TWO N02;Nl;0;L;;;;2;N;;;;; +125C0;CUNEIFORM NUMERIC SIGN THREE N02;Nl;0;L;;;;3;N;;;;; +125C1;CUNEIFORM NUMERIC SIGN FOUR N02;Nl;0;L;;;;4;N;;;;; +125C2;CUNEIFORM NUMERIC SIGN FIVE N02;Nl;0;L;;;;5;N;;;;; +125C3;CUNEIFORM NUMERIC SIGN SIX N02;Nl;0;L;;;;6;N;;;;; +125C4;CUNEIFORM NUMERIC SIGN SEVEN N02;Nl;0;L;;;;7;N;;;;; +125C5;CUNEIFORM NUMERIC SIGN EIGHT N02;Nl;0;L;;;;8;N;;;;; +125C6;CUNEIFORM NUMERIC SIGN NINE N02;Nl;0;L;;;;9;N;;;;; +125C7;CUNEIFORM NUMERIC SIGN ONE N15;Nl;0;L;;;;1;N;;;;; +125C8;CUNEIFORM NUMERIC SIGN TWO N15;Nl;0;L;;;;2;N;;;;; +125C9;CUNEIFORM NUMERIC SIGN THREE N15;Nl;0;L;;;;3;N;;;;; +125CA;CUNEIFORM NUMERIC SIGN FOUR N15;Nl;0;L;;;;4;N;;;;; +125CB;CUNEIFORM NUMERIC SIGN FIVE N15;Nl;0;L;;;;5;N;;;;; +125CC;CUNEIFORM NUMERIC SIGN ONE N35;Nl;0;L;;;;1;N;;;;; +125CD;CUNEIFORM NUMERIC SIGN TWO N35;Nl;0;L;;;;2;N;;;;; +125CE;CUNEIFORM NUMERIC SIGN THREE N35;Nl;0;L;;;;3;N;;;;; +125CF;CUNEIFORM NUMERIC SIGN FOUR N35;Nl;0;L;;;;4;N;;;;; +125D0;CUNEIFORM NUMERIC SIGN FIVE N35;Nl;0;L;;;;5;N;;;;; +125D1;CUNEIFORM NUMERIC SIGN ONE N06;Nl;0;L;;;;1;N;;;;; +125D2;CUNEIFORM NUMERIC SIGN TWO N06;Nl;0;L;;;;2;N;;;;; +125D3;CUNEIFORM NUMERIC SIGN THREE N06;Nl;0;L;;;;3;N;;;;; +125D4;CUNEIFORM NUMERIC SIGN FOUR N06;Nl;0;L;;;;4;N;;;;; +125D5;CUNEIFORM NUMERIC SIGN FIVE N06;Nl;0;L;;;;5;N;;;;; +125D6;CUNEIFORM NUMERIC SIGN SIX N06;Nl;0;L;;;;6;N;;;;; +125D7;CUNEIFORM NUMERIC SIGN SEVEN N06;Nl;0;L;;;;7;N;;;;; +125D8;CUNEIFORM NUMERIC SIGN EIGHT N06;Nl;0;L;;;;8;N;;;;; +125D9;CUNEIFORM NUMERIC SIGN NINE N06;Nl;0;L;;;;9;N;;;;; +125DA;CUNEIFORM NUMERIC SIGN ONE N21;Nl;0;L;;;;1;N;;;;; +125DB;CUNEIFORM NUMERIC SIGN TWO N21;Nl;0;L;;;;2;N;;;;; +125DC;CUNEIFORM NUMERIC SIGN THREE N21;Nl;0;L;;;;3;N;;;;; +125DD;CUNEIFORM NUMERIC SIGN FOUR N21;Nl;0;L;;;;4;N;;;;; +125DE;CUNEIFORM NUMERIC SIGN FIVE N21;Nl;0;L;;;;5;N;;;;; +125DF;CUNEIFORM NUMERIC SIGN ONE N38;Nl;0;L;;;;1;N;;;;; +125E0;CUNEIFORM NUMERIC SIGN ONE N52;Nl;0;L;;;;1;N;;;;; +125E1;CUNEIFORM NUMERIC SIGN TWO N52;Nl;0;L;;;;2;N;;;;; +125E2;CUNEIFORM NUMERIC SIGN THREE N52;Nl;0;L;;;;3;N;;;;; +125E3;CUNEIFORM NUMERIC SIGN FOUR N52;Nl;0;L;;;;4;N;;;;; +125E4;CUNEIFORM NUMERIC SIGN FIVE N52;Nl;0;L;;;;5;N;;;;; +125E5;CUNEIFORM NUMERIC SIGN SIX N52;Nl;0;L;;;;6;N;;;;; +125E6;CUNEIFORM NUMERIC SIGN SEVEN N52;Nl;0;L;;;;7;N;;;;; +125E7;CUNEIFORM NUMERIC SIGN EIGHT N52;Nl;0;L;;;;8;N;;;;; +125E8;CUNEIFORM NUMERIC SIGN NINE N52;Nl;0;L;;;;9;N;;;;; +125E9;CUNEIFORM NUMERIC SIGN ONE N60;Nl;0;L;;;;1;N;;;;; +125EA;CUNEIFORM NUMERIC SIGN ONE N24A;Nl;0;L;;;;1;N;;;;; +125EB;CUNEIFORM NUMERIC SIGN ONE N40;Nl;0;L;;;;1;N;;;;; +125EC;CUNEIFORM NUMERIC SIGN TWO N40;Nl;0;L;;;;2;N;;;;; +125ED;CUNEIFORM NUMERIC SIGN THREE N40;Nl;0;L;;;;3;N;;;;; +125EE;CUNEIFORM NUMERIC SIGN FOUR N40;Nl;0;L;;;;4;N;;;;; +125EF;CUNEIFORM NUMERIC SIGN ONE N03;Nl;0;L;;;;1;N;;;;; +125F0;CUNEIFORM NUMERIC SIGN TWO N03;Nl;0;L;;;;2;N;;;;; +125F1;CUNEIFORM NUMERIC SIGN THREE N03;Nl;0;L;;;;3;N;;;;; +125F2;CUNEIFORM NUMERIC SIGN FOUR N03;Nl;0;L;;;;4;N;;;;; +125F3;CUNEIFORM NUMERIC SIGN FIVE N03;Nl;0;L;;;;5;N;;;;; +125F4;CUNEIFORM NUMERIC SIGN ONE N18;Nl;0;L;;;;1;N;;;;; +125F5;CUNEIFORM NUMERIC SIGN TWO N18;Nl;0;L;;;;2;N;;;;; +125F6;CUNEIFORM NUMERIC SIGN THREE N18;Nl;0;L;;;;3;N;;;;; +125F7;CUNEIFORM NUMERIC SIGN FOUR N18;Nl;0;L;;;;4;N;;;;; +125F8;CUNEIFORM NUMERIC SIGN FIVE N18;Nl;0;L;;;;5;N;;;;; +125F9;CUNEIFORM NUMERIC SIGN SIX N18;Nl;0;L;;;;6;N;;;;; +125FA;CUNEIFORM NUMERIC SIGN SEVEN N18;Nl;0;L;;;;7;N;;;;; +125FB;CUNEIFORM NUMERIC SIGN EIGHT N18;Nl;0;L;;;;8;N;;;;; +125FC;CUNEIFORM NUMERIC SIGN NINE N18;Nl;0;L;;;;9;N;;;;; +125FD;CUNEIFORM NUMERIC SIGN ONE N45A;Nl;0;L;;;;1;N;;;;; +125FE;CUNEIFORM NUMERIC SIGN ONE N24B;Nl;0;L;;;;1;N;;;;; +125FF;CUNEIFORM NUMERIC SIGN ONE N26B;Nl;0;L;;;;1;N;;;;; +12600;CUNEIFORM NUMERIC SIGN ONE N28B;Nl;0;L;;;;1;N;;;;; +12601;CUNEIFORM NUMERIC SIGN ONE N29AB;Nl;0;L;;;;1;N;;;;; +12602;CUNEIFORM NUMERIC SIGN ONE N41;Nl;0;L;;;;1;N;;;;; +12603;CUNEIFORM NUMERIC SIGN TWO N41;Nl;0;L;;;;2;N;;;;; +12604;CUNEIFORM NUMERIC SIGN THREE N41;Nl;0;L;;;;3;N;;;;; +12605;CUNEIFORM NUMERIC SIGN FOUR N41;Nl;0;L;;;;4;N;;;;; +12606;CUNEIFORM NUMERIC SIGN ONE N04;Nl;0;L;;;;1;N;;;;; +12607;CUNEIFORM NUMERIC SIGN TWO N04;Nl;0;L;;;;2;N;;;;; +12608;CUNEIFORM NUMERIC SIGN THREE N04;Nl;0;L;;;;3;N;;;;; +12609;CUNEIFORM NUMERIC SIGN FOUR N04;Nl;0;L;;;;4;N;;;;; +1260A;CUNEIFORM NUMERIC SIGN FIVE N04;Nl;0;L;;;;5;N;;;;; +1260B;CUNEIFORM NUMERIC SIGN ONE N19;Nl;0;L;;;;1;N;;;;; +1260C;CUNEIFORM NUMERIC SIGN TWO N19;Nl;0;L;;;;2;N;;;;; +1260D;CUNEIFORM NUMERIC SIGN THREE N19;Nl;0;L;;;;3;N;;;;; +1260E;CUNEIFORM NUMERIC SIGN FOUR N19;Nl;0;L;;;;4;N;;;;; +1260F;CUNEIFORM NUMERIC SIGN FIVE N19;Nl;0;L;;;;5;N;;;;; +12610;CUNEIFORM NUMERIC SIGN SIX N19;Nl;0;L;;;;6;N;;;;; +12611;CUNEIFORM NUMERIC SIGN SEVEN N19;Nl;0;L;;;;7;N;;;;; +12612;CUNEIFORM NUMERIC SIGN EIGHT N19;Nl;0;L;;;;8;N;;;;; +12613;CUNEIFORM NUMERIC SIGN NINE N19;Nl;0;L;;;;9;N;;;;; +12614;CUNEIFORM NUMERIC SIGN ONE N46;Nl;0;L;;;;1;N;;;;; +12615;CUNEIFORM NUMERIC SIGN TWO N46;Nl;0;L;;;;2;N;;;;; +12616;CUNEIFORM NUMERIC SIGN ONE N36;Nl;0;L;;;;1;N;;;;; +12617;CUNEIFORM NUMERIC SIGN TWO N36;Nl;0;L;;;;2;N;;;;; +12618;CUNEIFORM NUMERIC SIGN THREE N36;Nl;0;L;;;;3;N;;;;; +12619;CUNEIFORM NUMERIC SIGN FOUR N36;Nl;0;L;;;;4;N;;;;; +1261A;CUNEIFORM NUMERIC SIGN FIVE N36;Nl;0;L;;;;5;N;;;;; +1261B;CUNEIFORM NUMERIC SIGN SIX N36;Nl;0;L;;;;6;N;;;;; +1261C;CUNEIFORM NUMERIC SIGN SEVEN N36;Nl;0;L;;;;7;N;;;;; +1261D;CUNEIFORM NUMERIC SIGN EIGHT N36;Nl;0;L;;;;8;N;;;;; +1261E;CUNEIFORM NUMERIC SIGN NINE N36;Nl;0;L;;;;9;N;;;;; +1261F;CUNEIFORM NUMERIC SIGN ONE N49;Nl;0;L;;;;1;N;;;;; +12620;CUNEIFORM NUMERIC SIGN TWO N49;Nl;0;L;;;;2;N;;;;; +12621;CUNEIFORM NUMERIC SIGN THREE N49;Nl;0;L;;;;3;N;;;;; +12622;CUNEIFORM NUMERIC SIGN FOUR N49;Nl;0;L;;;;4;N;;;;; +12623;CUNEIFORM NUMERIC SIGN ONE N25;Nl;0;L;;;;1;N;;;;; +12624;CUNEIFORM NUMERIC SIGN ONE N27;Nl;0;L;;;;1;N;;;;; +12625;CUNEIFORM NUMERIC SIGN ONE N28C;Nl;0;L;;;;1;N;;;;; +12626;CUNEIFORM NUMERIC SIGN ONE N29AC;Nl;0;L;;;;1;N;;;;; +12627;CUNEIFORM NUMERIC SIGN ONE N30AC;Nl;0;L;;;;1;N;;;;; +12628;CUNEIFORM NUMERIC SIGN ONE N30CC;Nl;0;L;;;;1;N;;;;; +12629;CUNEIFORM NUMERIC SIGN ONE N42A;Nl;0;L;;;;1;N;;;;; +1262A;CUNEIFORM NUMERIC SIGN TWO N42A;Nl;0;L;;;;2;N;;;;; +1262B;CUNEIFORM NUMERIC SIGN THREE N42A;Nl;0;L;;;;3;N;;;;; +1262C;CUNEIFORM NUMERIC SIGN FOUR N42A;Nl;0;L;;;;4;N;;;;; +1262D;CUNEIFORM NUMERIC SIGN ONE N42B;Nl;0;L;;;;1;N;;;;; +1262E;CUNEIFORM NUMERIC SIGN TWO N42B;Nl;0;L;;;;2;N;;;;; +1262F;CUNEIFORM NUMERIC SIGN THREE N42B;Nl;0;L;;;;3;N;;;;; +12630;CUNEIFORM NUMERIC SIGN FOUR N42B;Nl;0;L;;;;4;N;;;;; +12631;CUNEIFORM NUMERIC SIGN ONE N05;Nl;0;L;;;;1;N;;;;; +12632;CUNEIFORM NUMERIC SIGN TWO N05;Nl;0;L;;;;2;N;;;;; +12633;CUNEIFORM NUMERIC SIGN THREE N05;Nl;0;L;;;;3;N;;;;; +12634;CUNEIFORM NUMERIC SIGN FOUR N05;Nl;0;L;;;;4;N;;;;; +12635;CUNEIFORM NUMERIC SIGN FIVE N05;Nl;0;L;;;;5;N;;;;; +12636;CUNEIFORM NUMERIC SIGN ONE N20;Nl;0;L;;;;1;N;;;;; +12637;CUNEIFORM NUMERIC SIGN TWO N20;Nl;0;L;;;;2;N;;;;; +12638;CUNEIFORM NUMERIC SIGN THREE N20;Nl;0;L;;;;3;N;;;;; +12639;CUNEIFORM NUMERIC SIGN FOUR N20;Nl;0;L;;;;4;N;;;;; +1263A;CUNEIFORM NUMERIC SIGN FIVE N20;Nl;0;L;;;;5;N;;;;; +1263B;CUNEIFORM NUMERIC SIGN SIX N20;Nl;0;L;;;;6;N;;;;; +1263C;CUNEIFORM NUMERIC SIGN SEVEN N20;Nl;0;L;;;;7;N;;;;; +1263D;CUNEIFORM NUMERIC SIGN EIGHT N20;Nl;0;L;;;;8;N;;;;; +1263E;CUNEIFORM NUMERIC SIGN NINE N20;Nl;0;L;;;;9;N;;;;; +1263F;CUNEIFORM NUMERIC SIGN ONE N47;Nl;0;L;;;;1;N;;;;; +12640;CUNEIFORM NUMERIC SIGN TWO N47;Nl;0;L;;;;2;N;;;;; +12641;CUNEIFORM NUMERIC SIGN ONE N37;Nl;0;L;;;;1;N;;;;; +12642;CUNEIFORM NUMERIC SIGN TWO N37;Nl;0;L;;;;2;N;;;;; +12643;CUNEIFORM NUMERIC SIGN ONE N09;Nl;0;L;;;;1;N;;;;; +12644;CUNEIFORM NUMERIC SIGN ONE N11;Nl;0;L;;;;1;N;;;;; +12645;CUNEIFORM NUMERIC SIGN ONE N12;Nl;0;L;;;;1;N;;;;; +12646;CUNEIFORM NUMERIC SIGN ONE N07A;Nl;0;L;;;;1;N;;;;; +12647;CUNEIFORM NUMERIC SIGN TWO N07A;Nl;0;L;;;;2;N;;;;; +12648;CUNEIFORM NUMERIC SIGN THREE N07A;Nl;0;L;;;;3;N;;;;; +12649;CUNEIFORM NUMERIC SIGN ONE N07B;Nl;0;L;;;;1;N;;;;; +1264A;CUNEIFORM NUMERIC SIGN TWO N07B;Nl;0;L;;;;2;N;;;;; +1264B;CUNEIFORM NUMERIC SIGN THREE N07B;Nl;0;L;;;;3;N;;;;; +1264C;CUNEIFORM NUMERIC SIGN ONE N01 FLAT;Nl;0;L;;;;1;N;;;;; +1264D;CUNEIFORM NUMERIC SIGN TWO N01 FLAT;Nl;0;L;;;;2;N;;;;; +1264E;CUNEIFORM NUMERIC SIGN THREE N01 FLAT;Nl;0;L;;;;3;N;;;;; +1264F;CUNEIFORM NUMERIC SIGN FOUR N01 FLAT;Nl;0;L;;;;4;N;;;;; +12650;CUNEIFORM NUMERIC SIGN FIVE N01 FLAT;Nl;0;L;;;;5;N;;;;; +12651;CUNEIFORM NUMERIC SIGN SIX N01 FLAT;Nl;0;L;;;;6;N;;;;; +12652;CUNEIFORM NUMERIC SIGN SEVEN N01 FLAT;Nl;0;L;;;;7;N;;;;; +12653;CUNEIFORM NUMERIC SIGN EIGHT N01 FLAT;Nl;0;L;;;;8;N;;;;; +12654;CUNEIFORM NUMERIC SIGN NINE N01 FLAT;Nl;0;L;;;;9;N;;;;; +12655;CUNEIFORM NUMERIC SIGN ONE N08 FLAT;Nl;0;L;;;;1;N;;;;; +12656;CUNEIFORM NUMERIC SIGN ONE N14 FLAT;Nl;0;L;;;;1;N;;;;; +12657;CUNEIFORM NUMERIC SIGN TWO N14 FLAT;Nl;0;L;;;;2;N;;;;; +12658;CUNEIFORM NUMERIC SIGN THREE N14 FLAT;Nl;0;L;;;;3;N;;;;; +12659;CUNEIFORM NUMERIC SIGN FOUR N14 FLAT;Nl;0;L;;;;4;N;;;;; +1265A;CUNEIFORM NUMERIC SIGN FIVE N14 FLAT;Nl;0;L;;;;5;N;;;;; +1265B;CUNEIFORM NUMERIC SIGN SIX N14 FLAT;Nl;0;L;;;;6;N;;;;; +1265C;CUNEIFORM NUMERIC SIGN SEVEN N14 FLAT;Nl;0;L;;;;7;N;;;;; +1265D;CUNEIFORM NUMERIC SIGN EIGHT N14 FLAT;Nl;0;L;;;;8;N;;;;; +1265E;CUNEIFORM NUMERIC SIGN NINE N14 FLAT;Nl;0;L;;;;9;N;;;;; +1265F;CUNEIFORM NUMERIC SIGN ONE N34 FLAT;Nl;0;L;;;;1;N;;;;; +12660;CUNEIFORM NUMERIC SIGN TWO N34 FLAT;Nl;0;L;;;;2;N;;;;; +12661;CUNEIFORM NUMERIC SIGN THREE N34 FLAT;Nl;0;L;;;;3;N;;;;; +12662;CUNEIFORM NUMERIC SIGN FOUR N34 FLAT;Nl;0;L;;;;4;N;;;;; +12663;CUNEIFORM NUMERIC SIGN FIVE N34 FLAT;Nl;0;L;;;;5;N;;;;; +12664;CUNEIFORM NUMERIC SIGN SIX N34 FLAT;Nl;0;L;;;;6;N;;;;; +12665;CUNEIFORM NUMERIC SIGN SEVEN N34 FLAT;Nl;0;L;;;;7;N;;;;; +12666;CUNEIFORM NUMERIC SIGN EIGHT N34 FLAT;Nl;0;L;;;;8;N;;;;; +12667;CUNEIFORM NUMERIC SIGN NINE N34 FLAT;Nl;0;L;;;;9;N;;;;; +12668;CUNEIFORM NUMERIC SIGN ONE N45 FLAT;Nl;0;L;;;;1;N;;;;; +12669;CUNEIFORM NUMERIC SIGN TWO N45 FLAT;Nl;0;L;;;;2;N;;;;; +1266A;CUNEIFORM NUMERIC SIGN ONE N22 FLAT;Nl;0;L;;;;1;N;;;;; +1266B;CUNEIFORM NUMERIC SIGN TWO N22 FLAT;Nl;0;L;;;;2;N;;;;; +1266C;CUNEIFORM NUMERIC SIGN ONE N51 FLAT;Nl;0;L;;;;1;N;;;;; +1266D;CUNEIFORM NUMERIC SIGN TWO N51 FLAT;Nl;0;L;;;;2;N;;;;; +1266E;CUNEIFORM NUMERIC SIGN THREE N51 FLAT;Nl;0;L;;;;3;N;;;;; +1266F;CUNEIFORM NUMERIC SIGN FOUR N51 FLAT;Nl;0;L;;;;4;N;;;;; +12670;CUNEIFORM NUMERIC SIGN FIVE N51 FLAT;Nl;0;L;;;;5;N;;;;; +12671;CUNEIFORM NUMERIC SIGN SIX N51 FLAT;Nl;0;L;;;;6;N;;;;; +12672;CUNEIFORM NUMERIC SIGN SEVEN N51 FLAT;Nl;0;L;;;;7;N;;;;; +12673;CUNEIFORM NUMERIC SIGN EIGHT N51 FLAT;Nl;0;L;;;;8;N;;;;; +12674;CUNEIFORM NUMERIC SIGN NINE N51 FLAT;Nl;0;L;;;;9;N;;;;; +12675;CUNEIFORM NUMERIC SIGN ONE N34 FLAT TENU;Nl;0;L;;;;1;N;;;;; +12676;CUNEIFORM NUMERIC SIGN ONE N04 FLAT;Nl;0;L;;;;1;N;;;;; +12677;CUNEIFORM NUMERIC SIGN TWO N04 FLAT;Nl;0;L;;;;2;N;;;;; +12678;CUNEIFORM NUMERIC SIGN THREE N04 FLAT;Nl;0;L;;;;3;N;;;;; +12679;CUNEIFORM NUMERIC SIGN FOUR N04 FLAT;Nl;0;L;;;;4;N;;;;; +1267A;CUNEIFORM NUMERIC SIGN FIVE N04 FLAT;Nl;0;L;;;;5;N;;;;; +1267B;CUNEIFORM NUMERIC SIGN ONE N19 FLAT;Nl;0;L;;;;1;N;;;;; +1267C;CUNEIFORM NUMERIC SIGN TWO N19 FLAT;Nl;0;L;;;;2;N;;;;; +1267D;CUNEIFORM NUMERIC SIGN THREE N19 FLAT;Nl;0;L;;;;3;N;;;;; +1267E;CUNEIFORM NUMERIC SIGN FOUR N19 FLAT;Nl;0;L;;;;4;N;;;;; +1267F;CUNEIFORM NUMERIC SIGN FIVE N19 FLAT;Nl;0;L;;;;5;N;;;;; +12680;CUNEIFORM NUMERIC SIGN SIX N19 FLAT;Nl;0;L;;;;6;N;;;;; +12681;CUNEIFORM NUMERIC SIGN SEVEN N19 FLAT;Nl;0;L;;;;7;N;;;;; +12682;CUNEIFORM NUMERIC SIGN EIGHT N19 FLAT;Nl;0;L;;;;8;N;;;;; +12683;CUNEIFORM NUMERIC SIGN NINE N19 FLAT;Nl;0;L;;;;9;N;;;;; +12684;CUNEIFORM NUMERIC SIGN ONE N46 FLAT;Nl;0;L;;;;1;N;;;;; +12685;CUNEIFORM NUMERIC SIGN TWO N46 FLAT;Nl;0;L;;;;2;N;;;;; +12686;CUNEIFORM NUMERIC SIGN ONE N36 FLAT;Nl;0;L;;;;1;N;;;;; 12F90;CYPRO-MINOAN SIGN CM001;Lo;0;L;;;;;N;;;;; 12F91;CYPRO-MINOAN SIGN CM002;Lo;0;L;;;;;N;;;;; 12F92;CYPRO-MINOAN SIGN CM004;Lo;0;L;;;;;N;;;;; @@ -31739,9 +32138,14 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 18CD3;KHITAN SMALL SCRIPT CHARACTER-18CD3;Lo;0;L;;;;;N;;;;; 18CD4;KHITAN SMALL SCRIPT CHARACTER-18CD4;Lo;0;L;;;;;N;;;;; 18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;; +18CD6;KHITAN SMALL SCRIPT CHARACTER-18CD6;Lo;0;L;;;;;N;;;;; +18CD7;KHITAN SMALL SCRIPT CHARACTER-18CD7;Lo;0;L;;;;;N;;;;; +18CD8;KHITAN SMALL SCRIPT CHARACTER-18CD8;Lo;0;L;;;;;N;;;;; +18CD9;KHITAN SMALL SCRIPT CHARACTER-18CD9;Lo;0;L;;;;;N;;;;; +18CDA;KHITAN SMALL SCRIPT CHARACTER-18CDA;Lo;0;L;;;;;N;;;;; 18CFF;KHITAN SMALL SCRIPT CHARACTER-18CFF;Lo;0;L;;;;;N;;;;; 18D00;;Lo;0;L;;;;;N;;;;; -18D1E;;Lo;0;L;;;;;N;;;;; +18D20;;Lo;0;L;;;;;N;;;;; 18D80;TANGUT COMPONENT-769;Lo;0;L;;;;;N;;;;; 18D81;TANGUT COMPONENT-770;Lo;0;L;;;;;N;;;;; 18D82;TANGUT COMPONENT-771;Lo;0;L;;;;;N;;;;; @@ -31857,6 +32261,59 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 18DF0;TANGUT COMPONENT-881;Lo;0;L;;;;;N;;;;; 18DF1;TANGUT COMPONENT-882;Lo;0;L;;;;;N;;;;; 18DF2;TANGUT COMPONENT-883;Lo;0;L;;;;;N;;;;; +18E00;;Lo;0;L;;;;;N;;;;; +19191;;Lo;0;L;;;;;N;;;;; +191A0;JURCHEN RADICAL-01;Lo;0;L;;;;;N;;;;; +191A1;JURCHEN RADICAL-02;Lo;0;L;;;;;N;;;;; +191A2;JURCHEN RADICAL-03;Lo;0;L;;;;;N;;;;; +191A3;JURCHEN RADICAL-04;Lo;0;L;;;;;N;;;;; +191A4;JURCHEN RADICAL-05;Lo;0;L;;;;;N;;;;; +191A5;JURCHEN RADICAL-06;Lo;0;L;;;;;N;;;;; +191A6;JURCHEN RADICAL-07;Lo;0;L;;;;;N;;;;; +191A7;JURCHEN RADICAL-08;Lo;0;L;;;;;N;;;;; +191A8;JURCHEN RADICAL-09;Lo;0;L;;;;;N;;;;; +191A9;JURCHEN RADICAL-10;Lo;0;L;;;;;N;;;;; +191AA;JURCHEN RADICAL-11;Lo;0;L;;;;;N;;;;; +191AB;JURCHEN RADICAL-12;Lo;0;L;;;;;N;;;;; +191AC;JURCHEN RADICAL-13;Lo;0;L;;;;;N;;;;; +191AD;JURCHEN RADICAL-14;Lo;0;L;;;;;N;;;;; +191AE;JURCHEN RADICAL-15;Lo;0;L;;;;;N;;;;; +191AF;JURCHEN RADICAL-16;Lo;0;L;;;;;N;;;;; +191B0;JURCHEN RADICAL-17;Lo;0;L;;;;;N;;;;; +191B1;JURCHEN RADICAL-18;Lo;0;L;;;;;N;;;;; +191B2;JURCHEN RADICAL-19;Lo;0;L;;;;;N;;;;; +191B3;JURCHEN RADICAL-20;Lo;0;L;;;;;N;;;;; +191B4;JURCHEN RADICAL-21;Lo;0;L;;;;;N;;;;; +191B5;JURCHEN RADICAL-22;Lo;0;L;;;;;N;;;;; +191B6;JURCHEN RADICAL-23;Lo;0;L;;;;;N;;;;; +191B7;JURCHEN RADICAL-24;Lo;0;L;;;;;N;;;;; +191B8;JURCHEN RADICAL-25;Lo;0;L;;;;;N;;;;; +191B9;JURCHEN RADICAL-26;Lo;0;L;;;;;N;;;;; +191BA;JURCHEN RADICAL-27;Lo;0;L;;;;;N;;;;; +191BB;JURCHEN RADICAL-28;Lo;0;L;;;;;N;;;;; +191BC;JURCHEN RADICAL-29;Lo;0;L;;;;;N;;;;; +191BD;JURCHEN RADICAL-30;Lo;0;L;;;;;N;;;;; +191BE;JURCHEN RADICAL-31;Lo;0;L;;;;;N;;;;; +191BF;JURCHEN RADICAL-32;Lo;0;L;;;;;N;;;;; +191C0;JURCHEN RADICAL-33;Lo;0;L;;;;;N;;;;; +191C1;JURCHEN RADICAL-34;Lo;0;L;;;;;N;;;;; +191C2;JURCHEN RADICAL-35;Lo;0;L;;;;;N;;;;; +191C3;JURCHEN RADICAL-36;Lo;0;L;;;;;N;;;;; +191C4;JURCHEN RADICAL-37;Lo;0;L;;;;;N;;;;; +191C5;JURCHEN RADICAL-38;Lo;0;L;;;;;N;;;;; +191C6;JURCHEN RADICAL-39;Lo;0;L;;;;;N;;;;; +191C7;JURCHEN RADICAL-40;Lo;0;L;;;;;N;;;;; +191C8;JURCHEN RADICAL-41;Lo;0;L;;;;;N;;;;; +191C9;JURCHEN RADICAL-42;Lo;0;L;;;;;N;;;;; +191CA;JURCHEN RADICAL-43;Lo;0;L;;;;;N;;;;; +191CB;JURCHEN RADICAL-44;Lo;0;L;;;;;N;;;;; +191CC;JURCHEN RADICAL-45;Lo;0;L;;;;;N;;;;; +191CD;JURCHEN RADICAL-46;Lo;0;L;;;;;N;;;;; +191CE;JURCHEN RADICAL-47;Lo;0;L;;;;;N;;;;; +191CF;JURCHEN RADICAL-48;Lo;0;L;;;;;N;;;;; +191D0;JURCHEN RADICAL-49;Lo;0;L;;;;;N;;;;; +191D1;JURCHEN RADICAL-50;Lo;0;L;;;;;N;;;;; +191D2;JURCHEN RADICAL-51;Lo;0;L;;;;;N;;;;; 1AFF0;KATAKANA LETTER MINNAN TONE-2;Lm;0;L;;;;;N;;;;; 1AFF1;KATAKANA LETTER MINNAN TONE-3;Lm;0;L;;;;;N;;;;; 1AFF2;KATAKANA LETTER MINNAN TONE-4;Lm;0;L;;;;;N;;;;; @@ -32161,6 +32618,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;; 1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; 1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B123;HIRAGANA DIGRAPH KOTO;Lo;0;L; 3053 3068;;;;N;;;;; +1B124;KATAKANA DIGRAPH TOKI;Lo;0;L; 30C8 30AD;;;;N;;;;; +1B125;KATAKANA DIGRAPH TOTE;Lo;0;L; 30C8 30C6;;;;N;;;;; +1B126;KATAKANA DIGRAPH YORI;Lo;0;L; 30E8 30EA;;;;N;;;;; +1B127;KATAKANA LETTER ALTERNATE NE;Lo;0;L;;;;;N;;;;; +1B128;KATAKANA LETTER ALTERNATE WI;Lo;0;L;;;;;N;;;;; 1B132;HIRAGANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; 1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; 1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; @@ -32170,6 +32633,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; 1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; 1B167;KATAKANA LETTER SMALL N;Lo;0;L;;;;;N;;;;; +1B168;KATAKANA LETTER SMALL ARCHAIC YE;Lo;0;L;;;;;N;;;;; 1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; 1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; 1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; @@ -33425,6 +33889,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1CECE;BELLONA;So;0;ON;;;;;N;;;;; 1CECF;AMPHITRITE;So;0;ON;;;;;N;;;;; 1CED0;LEUKOTHEA;So;0;ON;;;;;N;;;;; +1CED2;ALCHEMICAL SYMBOL FOR OIL INVERTED;So;0;ON;;;;;N;;;;; +1CED3;ALCHEMICAL SYMBOL FOR MOON-JUPITER;So;0;ON;;;;;N;;;;; +1CED4;ALCHEMICAL SYMBOL FOR SALT OF TARTAR;So;0;ON;;;;;N;;;;; +1CEDD;SQUARE ROOT OF SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +1CEDE;SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +1CEDF;SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT OF SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; 1CEE0;GEOMANTIC FIGURE POPULUS;So;0;ON;;;;;N;;;;; 1CEE1;GEOMANTIC FIGURE TRISTITIA;So;0;ON;;;;;N;;;;; 1CEE2;GEOMANTIC FIGURE ALBUS;So;0;ON;;;;;N;;;;; @@ -33442,6 +33912,19 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1CEEE;GEOMANTIC FIGURE CAUDA DRACONIS;So;0;ON;;;;;N;;;;; 1CEEF;GEOMANTIC FIGURE VIA;So;0;ON;;;;;N;;;;; 1CEF0;MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +1CEF1;LEIBNIZIAN DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +1CEF2;LEIBNIZIAN MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +1CEF3;LEIBNIZIAN MULTIPLICATION-DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +1CEF4;LEIBNIZIAN FRACTION REDUCTION SIGN-1;Sm;0;ON;;;;;N;;;;; +1CEF5;LEIBNIZIAN FRACTION REDUCTION SIGN-2;Sm;0;ON;;;;;N;;;;; +1CEF6;SECTOR WITH CHORD;Sm;0;ON;;;;;N;;;;; +1CEF7;SECTOR WITH DOUBLE ARC;Sm;0;ON;;;;;N;;;;; +1CEF8;SECTOR WITH CHORD AND DOTTED ARC;Sm;0;ON;;;;;N;;;;; +1CEF9;MEASURED ANGLE WITH DOUBLE ARC;Sm;0;ON;;;;;N;;;;; +1CEFA;MEASURED ANGLE WITH CONCAVE ARC;Sm;0;ON;;;;;N;;;;; +1CEFB;MEASURED ANGLE WITH DOUBLE CONCAVE ARC;Sm;0;ON;;;;;N;;;;; +1CEFC;ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;; +1CEFD;HYPERBOLA;Sm;0;ON;;;;;N;;;;; 1CF00;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; 1CF01;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; 1CF02;ZNAMENNY COMBINING MARK TSATA ON LEFT;Mn;0;NSM;;;;;N;;;;; @@ -33912,6 +34395,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; 1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; 1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D127;MUSICAL SYMBOL COMBINING STRESS;Mn;220;NSM;;;;;N;;;;; +1D128;MUSICAL SYMBOL COMBINING UNSTRESS;Mn;220;NSM;;;;;N;;;;; 1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; 1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; 1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; @@ -34106,6 +34591,27 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; 1D1E9;MUSICAL SYMBOL SORI;So;0;ON;;;;;N;;;;; 1D1EA;MUSICAL SYMBOL KORON;So;0;ON;;;;;N;;;;; +1D1EB;MUSICAL SYMBOL HALF SHARP;So;0;L;;;;;N;;;;; +1D1EC;MUSICAL SYMBOL ONE AND A HALF SHARP;So;0;L;;;;;N;;;;; +1D1ED;MUSICAL SYMBOL REVERSED FLAT;So;0;L;;;;;N;;;;; +1D1EE;MUSICAL SYMBOL REVERSED FLAT AND FLAT;So;0;L;;;;;N;;;;; +1D1EF;MUSICAL SYMBOL HALF SHARP UP;So;0;L;;;;;N;;;;; +1D1F0;MUSICAL SYMBOL HALF SHARP DOWN;So;0;L;;;;;N;;;;; +1D1F1;MUSICAL SYMBOL ONE AND A HALF SHARP UP;So;0;L;;;;;N;;;;; +1D1F2;MUSICAL SYMBOL ONE AND A HALF SHARP DOWN;So;0;L;;;;;N;;;;; +1D1F3;MUSICAL SYMBOL REVERSED FLAT UP;So;0;L;;;;;N;;;;; +1D1F4;MUSICAL SYMBOL REVERSED FLAT DOWN;So;0;L;;;;;N;;;;; +1D1F5;MUSICAL SYMBOL REVERSED FLAT AND FLAT UP;So;0;L;;;;;N;;;;; +1D1F6;MUSICAL SYMBOL REVERSED FLAT AND FLAT DOWN;So;0;L;;;;;N;;;;; +1D1F7;MUSICAL SYMBOL DIGIT TWO WITH STROKE;So;0;L;;;;;N;;;;; +1D1F8;MUSICAL SYMBOL DIGIT FOUR WITH STROKE;So;0;L;;;;;N;;;;; +1D1F9;MUSICAL SYMBOL DIGIT FIVE WITH STROKE;So;0;L;;;;;N;;;;; +1D1FA;MUSICAL SYMBOL DIGIT SIX WITH STROKE;So;0;L;;;;;N;;;;; +1D1FB;MUSICAL SYMBOL DIGIT SEVEN WITH STROKE;So;0;L;;;;;N;;;;; +1D1FC;MUSICAL SYMBOL DIGIT NINE WITH STROKE;So;0;L;;;;;N;;;;; +1D1FD;MUSICAL SYMBOL DIGIT FIVE WITH LOW STROKE;So;0;L;;;;;N;;;;; +1D1FE;MUSICAL SYMBOL DIGIT SEVEN WITH LOW STROKE;So;0;L;;;;;N;;;;; +1D1FF;MUSICAL SYMBOL LONGA REST;So;0;L;;;;;N;;;;; 1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; 1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; 1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; @@ -34176,6 +34682,56 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; 1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; 1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D250;MUSICAL SYMBOL COMBINING FLAG-6;Mc;216;L;;;;;N;;;;; +1D251;MUSICAL SYMBOL COMBINING FLAG-7;Mc;216;L;;;;;N;;;;; +1D252;MUSICAL SYMBOL COMBINING FLAG-8;Mc;216;L;;;;;N;;;;; +1D253;MUSICAL SYMBOL TWO HUNDRED FIFTY-SIXTH REST;So;0;L;;;;;N;;;;; +1D254;MUSICAL SYMBOL FIVE HUNDRED TWELFTH REST;So;0;L;;;;;N;;;;; +1D255;MUSICAL SYMBOL ONE THOUSAND TWENTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D256;MUSICAL SYMBOL FLAT WITH STROKE;So;0;L;;;;;N;;;;; +1D257;MUSICAL SYMBOL FLAT WITH DOUBLE STROKE;So;0;L;;;;;N;;;;; +1D258;MUSICAL SYMBOL FLAT WITH DOUBLE STEM;So;0;L;;;;;N;;;;; +1D259;MUSICAL SYMBOL HALF SHARP WITH STROKE;So;0;L;;;;;N;;;;; +1D25A;MUSICAL SYMBOL SHARP WITH STROKE;So;0;L;;;;;N;;;;; +1D25B;MUSICAL SYMBOL COMBINING TREMOLO-4;Mn;1;NSM;;;;;N;;;;; +1D25C;MUSICAL SYMBOL COMBINING TREMOLO-5;Mn;1;NSM;;;;;N;;;;; +1D25D;MUSICAL SYMBOL FINGERED TREMOLO-4;So;0;L;;;;;N;;;;; +1D25E;MUSICAL SYMBOL FINGERED TREMOLO-5;So;0;L;;;;;N;;;;; +1D25F;MUSICAL SYMBOL COMBINING BUZZ ROLL STEM;Mc;216;L;;;;;N;;;;; +1D260;MUSICAL SYMBOL TRIPLE FLAT;So;0;L;;;;;N;;;;; +1D261;MUSICAL SYMBOL SUSPENSION;So;0;L;;;;;N;;;;; +1D262;MUSICAL SYMBOL HEAVY DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D263;MUSICAL SYMBOL SYSTEM DIVIDER;So;0;L;;;;;N;;;;; +1D264;MUSICAL SYMBOL NIENTE;So;0;L;;;;;N;;;;; +1D265;MUSICAL SYMBOL CRESCENDO WITH RING;So;0;L;;;;;N;;;;; +1D266;MUSICAL SYMBOL DECRESCENDO WITH RING;So;0;L;;;;;N;;;;; +1D267;MUSICAL SYMBOL DIAMOND NOTEHEAD WHOLE;So;0;L;;;;;N;;;;; +1D268;MUSICAL SYMBOL DIAMOND NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D269;MUSICAL SYMBOL DIAMOND NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D26A;MUSICAL SYMBOL DIAMOND NOTEHEAD HALF-FILLED;So;0;L;;;;;N;;;;; +1D26B;MUSICAL SYMBOL TRIANGULAR FERMATA;So;0;L;;;;;N;;;;; +1D26C;MUSICAL SYMBOL DOUBLE TRIANGULAR FERMATA;So;0;L;;;;;N;;;;; +1D26D;MUSICAL SYMBOL SQUARE FERMATA;So;0;L;;;;;N;;;;; +1D26E;MUSICAL SYMBOL DOUBLE SQUARE FERMATA;So;0;L;;;;;N;;;;; +1D26F;MUSICAL SYMBOL HENZE LONG FERMATA;So;0;L;;;;;N;;;;; +1D270;MUSICAL SYMBOL HENZE SHORT FERMATA;So;0;L;;;;;N;;;;; +1D271;MUSICAL SYMBOL CURLEW;So;0;L;;;;;N;;;;; +1D272;MUSICAL SYMBOL SALZEDO BREATH MARK;So;0;L;;;;;N;;;;; +1D273;MUSICAL SYMBOL ORGAN PEDAL HEEL;So;0;L;;;;;N;;;;; +1D274;MUSICAL SYMBOL ORGAN PEDAL TOE;So;0;L;;;;;N;;;;; +1D275;MUSICAL SYMBOL G CLEF OPTIONALLY OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D276;MUSICAL SYMBOL DOUBLE G CLEF;So;0;L;;;;;N;;;;; +1D277;MUSICAL SYMBOL G CLEF OTTAVA BASSA WITH C CLEF;So;0;L;;;;;N;;;;; +1D278;MUSICAL SYMBOL C CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D279;MUSICAL SYMBOL G CLEF QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D27A;MUSICAL SYMBOL G CLEF QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D27B;MUSICAL SYMBOL F CLEF QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D27C;MUSICAL SYMBOL F CLEF QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D27D;MUSICAL SYMBOL C CLEF QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D27E;MUSICAL SYMBOL TABLATURE CLEF;So;0;L;;;;;N;;;;; +1D27F;MUSICAL SYMBOL ARPEGGIATO UP WITH ARROW;So;0;L;;;;;N;;;;; +1D280;MUSICAL SYMBOL COMBINING STEM BOW BEHIND BRIDGE;Mc;216;L;;;;;N;;;;; +1D281;MUSICAL SYMBOL COMBINING STEM BOW ON TOP OF BRIDGE;Mc;216;L;;;;;N;;;;; 1D2C0;KAKTOVIK NUMERAL ZERO;No;0;L;;;;0;N;;;;; 1D2C1;KAKTOVIK NUMERAL ONE;No;0;L;;;;1;N;;;;; 1D2C2;KAKTOVIK NUMERAL TWO;No;0;L;;;;2;N;;;;; @@ -34982,6 +35538,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; 1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; 1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; +1D6A6;MATHEMATICAL ITALIC SMALL LIGATURE LONG S WITH DESCENDER S;Ll;0;L; 1DF95;;;;N;;;;; 1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; 1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; 1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; @@ -35996,6 +36553,35 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; 1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; 1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; +1DB00;LEIBNIZIAN EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +1DB01;LEIBNIZIAN EQUALS SIGN WITH DOUBLE VERTICALS;Sm;0;ON;;;;;N;;;;; +1DB02;LEIBNIZIAN EQUALS SIGN WITH SMALL S;Sm;0;ON;;;;;N;;;;; +1DB03;LEIBNIZIAN GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +1DB04;LEIBNIZIAN LESS-THAN;Sm;0;ON;;;;;Y;;;;; +1DB05;LEIBNIZIAN GREATER-THAN WITH SMALL P;Sm;0;ON;;;;;Y;;;;; +1DB06;LEIBNIZIAN LESS-THAN WITH SMALL P;Sm;0;ON;;;;;Y;;;;; +1DB07;LEIBNIZIAN GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +1DB08;INVERTED SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +1DB09;INVERTED SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +1DB0A;TWO-LINE GREATER-THAN;Sm;0;ON;;;;;N;;;;; +1DB0B;TWO-LINE LESS-THAN;Sm;0;ON;;;;;N;;;;; +1DB0C;COMMENSURABILITY;Sm;0;ON;;;;;N;;;;; +1DB0D;INCOMMENSURABILITY;Sm;0;ON;;;;;N;;;;; +1DB0E;COMMENSURABILITY IN SQUARE;Sm;0;ON;;;;;N;;;;; +1DB0F;INCOMMENSURABILITY IN SQUARE;Sm;0;ON;;;;;N;;;;; +1DB10;CARTESIAN EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +1DB11;LEIBNIZIAN CONGRUENCE;Sm;0;ON;;;;;N;;;;; +1DB12;LEIBNIZIAN CONGRUENCE WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +1DB13;LEIBNIZIAN CONGRUENCE-2;Sm;0;ON;;;;;N;;;;; +1DB14;LEIBNIZIAN CONGRUENCE-2 INVERTED;Sm;0;ON;;;;;N;;;;; +1DB15;LEIBNIZIAN CONGRUENCE-2 WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +1DB16;LEIBNIZIAN CONGRUENCE-2 WITH HORIZONTAL AND VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +1DB17;LEIBNIZIAN COINCIDENCE;Sm;0;ON;;;;;Y;;;;; +1DB18;INVERTED LAZY S OVER LAZY S;Sm;0;ON;;;;;Y;;;;; +1DB19;LEIBNIZIAN SIMILARITY;Sm;0;ON;;;;;N;;;;; +1DB1A;LEIBNIZIAN SIMILARITY-2;Sm;0;ON;;;;;N;;;;; +1DB1B;LEIBNIZIAN DISSIMILARITY;Sm;0;ON;;;;;Y;;;;; +1DB1C;FACIT SYMBOL;Sm;0;ON;;;;;N;;;;; 1DF00;LATIN SMALL LETTER FENG DIGRAPH WITH TRILL;Ll;0;L;;;;;N;;;;; 1DF01;LATIN SMALL LETTER REVERSED SCRIPT G;Ll;0;L;;;;;N;;;;; 1DF02;LATIN LETTER SMALL CAPITAL TURNED G;Ll;0;L;;;;;N;;;;; @@ -36027,12 +36613,163 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; 1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;; +1DF1F;LATIN SMALL LETTER D-ETH DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF20;LATIN SMALL LETTER D-LEZH DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF21;LATIN SMALL LETTER D-LEZH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF22;LATIN SMALL LETTER TL DIGRAPH WITH BELT;Ll;0;L;;;;;N;;;;; +1DF23;LATIN SMALL LETTER TL DIGRAPH WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +1DF24;LATIN SMALL LETTER T-THETA DIGRAPH;Ll;0;L;;;;;N;;;;; 1DF25;LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; 1DF26;LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; 1DF27;LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; 1DF28;LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; 1DF29;LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; 1DF2A;LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF2B;LATIN SMALL LETTER DEZH DIGRAPH WITH CURL;Ll;0;L;;;;;N;;;;; +1DF2C;LATIN SMALL LETTER TESH DIGRAPH WITH CURL;Ll;0;L;;;;;N;;;;; +1DF2D;LATIN SMALL LETTER D WITH HOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF2E;LATIN SMALL LETTER DZ DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF2F;LATIN SMALL LETTER ETH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF30;LATIN LETTER SMALL CAPITAL G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF31;LATIN SMALL LETTER GAMMA WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF32;LATIN SMALL LETTER H WITH STROKE AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF33;LATIN SMALL LETTER PHI WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF34;LATIN SMALL LETTER Q WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF35;LATIN LETTER SMALL CAPITAL R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF36;LATIN LETTER SMALL CAPITAL INVERTED R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF37;LATIN SMALL LETTER R WITH TAIL AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF38;LATIN SMALL LETTER TS DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF39;LATIN SMALL LETTER V WITH HOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF3A;LATIN LETTER PHARYNGEAL VOICED FRICATIVE WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF3B;LATIN SMALL LETTER BETA WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF3C;LATIN SMALL LETTER THETA WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF3D;LATIN SMALL LETTER CHI WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF3E;LATIN SMALL LETTER BARRED TURNED H;Ll;0;L;;;;;N;;;;; +1DF3F;LATIN SMALL LETTER BARRED W;Ll;0;L;;;;;N;;;;; +1DF40;LATIN CAPITAL LETTER BARRED A;Lu;0;L;;;;;N;;;;1DF41; +1DF41;LATIN SMALL LETTER BARRED A;Ll;0;L;;;;;N;;;1DF40;;1DF40 +1DF42;LATIN SMALL LETTER BARRED OPEN O;Ll;0;L;;;;;N;;;;; +1DF43;LATIN LETTER SMALL CAPITAL BARRED E;Ll;0;L;;;;;N;;;;; +1DF44;LATIN SMALL LETTER BARRED OPEN E;Ll;0;L;;;;;N;;;;; +1DF45;LATIN SMALL LETTER G WITH STROKE AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF46;LATIN SMALL LETTER BARRED H;Ll;0;L;;;;;N;;;;; +1DF47;LATIN SMALL LETTER BARRED H WITH HOOK;Ll;0;L;;;;;N;;;;; +1DF48;LATIN CAPITAL LETTER BARRED K;Lu;0;L;;;;;N;;;;1DF49; +1DF49;LATIN SMALL LETTER BARRED K;Ll;0;L;;;;;N;;;1DF48;;1DF48 +1DF4A;LATIN CAPITAL LETTER BARRED M;Lu;0;L;;;;;N;;;;1DF4B; +1DF4B;LATIN SMALL LETTER BARRED M;Ll;0;L;;;;;N;;;1DF4A;;1DF4A +1DF4C;LATIN SMALL LETTER BARRED M WITH HOOK;Ll;0;L;;;;;N;;;;; +1DF4D;LATIN CAPITAL LETTER BARRED N;Lu;0;L;;;;;N;;;;1DF4E; +1DF4E;LATIN SMALL LETTER BARRED N;Ll;0;L;;;;;N;;;1DF4D;;1DF4D +1DF4F;LATIN SMALL LETTER BARRED ENG;Ll;0;L;;;;;N;;;;; +1DF50;LATIN SMALL LETTER TURNED R WITH STROKE;Ll;0;L;;;;;N;;;;; +1DF51;LATIN CAPITAL LETTER BARRED V;Lu;0;L;;;;;N;;;;1DF52; +1DF52;LATIN SMALL LETTER BARRED V;Ll;0;L;;;;;N;;;1DF51;;1DF51 +1DF53;LATIN SMALL LETTER BARRED CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +1DF54;LATIN SMALL LETTER BARRED CHI;Ll;0;L;;;;;N;;;;; +1DF55;LATIN SMALL LETTER Y WITH LOW STROKE;Ll;0;L;;;;;N;;;;; +1DF56;LATIN LETTER GLOTTAL STOP WITH DOUBLE STROKE;Ll;0;L;;;;;N;;;;; +1DF57;LATIN SMALL LETTER TURNED R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF58;LATIN SMALL LETTER SPLIT O;Ll;0;L;;;;;N;;;;; +1DF59;LATIN SMALL LETTER SPLIT U;Ll;0;L;;;;;N;;;;; +1DF5A;LATIN SMALL LETTER HALF A;Ll;0;L;;;;;N;;;;; +1DF5B;LATIN SMALL LETTER STRETCHED C-H DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF5C;LATIN SMALL LETTER LUNATE EE;Ll;0;L;;;;;N;;;;; +1DF5D;LATIN SMALL LETTER IE;Ll;0;L;;;;;N;;;;; +1DF5E;LATIN SMALL LETTER OI DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF5F;LATIN SMALL LETTER OU DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF60;LATIN SMALL LETTER OMEGA WITH LOOP;Ll;0;L;;;;;N;;;;; +1DF61;LATIN SMALL LETTER R WITH LEFT TIE;Ll;0;L;;;;;N;;;;; +1DF62;LATIN SMALL LETTER ESH-H DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF63;LATIN SMALL LETTER STRETCHED T-H DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF64;LATIN SMALL LETTER REVERSED T-H DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF65;LATIN SMALL LETTER WH DIGRAPH;Ll;0;L;;;;;N;;;;; +1DF66;LATIN SMALL LETTER REVERSED Z;Ll;0;L;;;;;N;;;;; +1DF67;LATIN SMALL LETTER LEZH WITH CURL;Ll;0;L;;;;;N;;;;; +1DF68;LATIN CAPITAL LETTER PHONOTYPIC A WITH SWASH;Lu;0;L;;;;;N;;;;1DF69; +1DF69;LATIN SMALL LETTER PHONOTYPIC A WITH SWASH;Ll;0;L;;;;;N;;;1DF68;;1DF68 +1DF6A;LATIN CAPITAL LETTER PHONOTYPIC ROUNDTOP A;Lu;0;L;;;;;N;;;;1DF6B; +1DF6B;LATIN SMALL LETTER PHONOTYPIC ROUNDTOP A;Ll;0;L;;;;;N;;;1DF6A;;1DF6A +1DF6C;LATIN CAPITAL LETTER REVERSED SCRUPLE;Lu;0;L;;;;;N;;;;1DF6D; +1DF6D;LATIN SMALL LETTER REVERSED SCRUPLE;Ll;0;L;;;;;N;;;1DF6C;;1DF6C +1DF6E;LATIN CAPITAL LETTER PHONOTYPIC DIPHTHONG AI;Lu;0;L;;;;;N;;;;1DF6F; +1DF6F;LATIN SMALL LETTER PHONOTYPIC DIPHTHONG AI;Ll;0;L;;;;;N;;;1DF6E;;1DF6E +1DF70;LATIN SMALL LETTER I WITH PIGTAIL AT BOTTOM;Ll;0;L;;;;;N;;;;; +1DF71;LATIN SMALL LETTER STRETCHED I;Ll;0;L;;;;;N;;;;; +1DF72;LATIN CAPITAL LETTER O WITH CURL;Lu;0;L;;;;;N;;;;1DF73; +1DF73;LATIN SMALL LETTER O WITH CURL;Ll;0;L;;;;;N;;;1DF72;;1DF72 +1DF74;LATIN CAPITAL LETTER CLOSED OMEGA WITH LONG STEM;Lu;0;L;;;;;N;;;;1DF75; +1DF75;LATIN SMALL LETTER CLOSED OMEGA WITH LONG STEM;Ll;0;L;;;;;N;;;1DF74;;1DF74 +1DF76;LATIN CAPITAL LETTER TURNED CLOSED OMEGA;Lu;0;L;;;;;N;;;;1DF77; +1DF77;LATIN SMALL LETTER TURNED CLOSED OMEGA;Ll;0;L;;;;;N;;;1DF76;;1DF76 +1DF78;LATIN CAPITAL LETTER PHONOTYPIC TH;Lu;0;L;;;;;N;;;;1DF79; +1DF79;LATIN SMALL LETTER PHONOTYPIC TH;Ll;0;L;;;;;N;;;1DF78;;1DF78 +1DF7A;LATIN CAPITAL LETTER U WITH HOOK TAIL;Lu;0;L;;;;;N;;;;1DF7B; +1DF7B;LATIN SMALL LETTER U WITH HOOK TAIL;Ll;0;L;;;;;N;;;1DF7A;;1DF7A +1DF7C;LATIN CAPITAL LETTER U WITH NOTCH AT BOTTOM;Lu;0;L;;;;;N;;;;1DF7D; +1DF7D;LATIN SMALL LETTER U WITH NOTCH AT BOTTOM;Ll;0;L;;;;;N;;;1DF7C;;1DF7C +1DF7E;LATIN CAPITAL LETTER REVERSED U;Lu;0;L;;;;;N;;;;1DF7F; +1DF7F;LATIN SMALL LETTER REVERSED U;Ll;0;L;;;;;N;;;1DF7E;;1DF7E +1DF80;LATIN CAPITAL LETTER A WITH TOPBAR;Lo;0;L;;;;;N;;;;; +1DF81;LATIN CAPITAL LETTER E WITH BENT TOPBAR;Lo;0;L;;;;;N;;;;; +1DF90;LATIN SMALL LETTER C WITH LOW SLASH;Ll;0;L;;;;;N;;;;; +1DF91;LATIN SMALL LETTER C WITH LOOPED CEDILLA;Ll;0;L;;;;;N;;;;; +1DF92;LATIN SMALL LETTER C WITH RIGHT LOOP;Ll;0;L;;;;;N;;;;; +1DF93;LATIN SMALL LETTER D ROTUNDA WITH DESCENDING CROSSING LOOP;Ll;0;L;;;;;N;;;;; +1DF94;LATIN SMALL LETTER R ROTUNDA WITH LOOP;Ll;0;L;;;;;N;;;;; +1DF95;LATIN SMALL LIGATURE LONG S WITH DESCENDER S;Ll;0;L; 00DF;;;;N;;;;; +1DF96;LATIN SMALL LETTER LONG S WITH TOP LOOP;Ll;0;L;;;;;N;;;;; +1DFCD;MODIFIER LETTER SMALL TURNED R WITH MID-HEIGHT LEFT HOOK;Lm;0;L; 1DF57;;;;N;;;;; +1DFCE;MODIFIER LETTER SMALL SPLIT O;Lm;0;L; 1DF58;;;;N;;;;; +1DFCF;MODIFIER LETTER SMALL SPLIT U;Lm;0;L; 1DF59;;;;N;;;;; +1DFD0;LATIN SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 0263;;;;N;;;;; +1DFD1;MODIFIER LETTER SMALL CAPITAL P;Lm;0;L; 1D18;;;;N;;;;; +1DFD2;MODIFIER LETTER SMALL B WITH STROKE;Lm;0;L; 0180;;;;N;;;;; +1DFD3;MODIFIER LETTER SMALL D WITH STROKE;Lm;0;L; 0111;;;;N;;;;; +1DFD4;MODIFIER LETTER SMALL G WITH STROKE;Lm;0;L; 01E5;;;;N;;;;; +1DFD5;MODIFIER LETTER SMALL L WITH STROKE;Lm;0;L; 0142;;;;N;;;;; +1DFD6;MODIFIER LETTER SMALL L WITH BAR;Lm;0;L; 019A;;;;N;;;;; +1DFD7;MODIFIER LETTER SMALL TURNED R WITH STROKE;Lm;0;L; 1DF50;;;;N;;;;; +1DFD8;MODIFIER LETTER SMALL BARRED TURNED H;Lm;0;L; 1DF3E;;;;N;;;;; +1DFD9;MODIFIER LETTER SMALL J WITH STROKE;Lm;0;L; 0249;;;;N;;;;; +1DFDA;MODIFIER LETTER SMALL UPSILON WITH STROKE;Lm;0;L; 1D7F;;;;N;;;;; +1DFDB;MODIFIER LETTER SMALL BARRED W;Lm;0;L; 1DF3F;;;;N;;;;; +1DFDC;MODIFIER LETTER SMALL N WITH LONG RIGHT LEG;Lm;0;L; 019E;;;;N;;;;; +1DFDD;MODIFIER LETTER SMALL R WITH LONG LEG;Lm;0;L; 027C;;;;N;;;;; +1DFDE;MODIFIER LETTER SMALL DB DIGRAPH;Lm;0;L; 0238;;;;N;;;;; +1DFDF;MODIFIER LETTER SMALL QP DIGRAPH;Lm;0;L; 0239;;;;N;;;;; +1DFE0;MODIFIER LETTER SMALL DEZH DIGRAPH WITH CURL;Lm;0;L; 1DF2B;;;;N;;;;; +1DFE1;MODIFIER LETTER SMALL DEZH DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; 1DF19;;;;N;;;;; +1DFE2;MODIFIER LETTER SMALL ESH WITH CURL;Lm;0;L; 0286;;;;N;;;;; +1DFE3;MODIFIER LETTER SMALL ESH WITH RETROFLEX HOOK;Lm;0;L; 1D98;;;;N;;;;; +1DFE4;MODIFIER LETTER SMALL TESH DIGRAPH WITH CURL;Lm;0;L; 1DF2C;;;;N;;;;; +1DFE5;MODIFIER LETTER SMALL TESH DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; 1DF1C;;;;N;;;;; +1DFE6;MODIFIER LETTER SMALL EZH WITH CURL;Lm;0;L; 0293;;;;N;;;;; +1DFE7;MODIFIER LETTER SMALL EZH WITH RETROFLEX HOOK;Lm;0;L; 1D9A;;;;N;;;;; +1DFE8;MODIFIER LETTER SMALL CAPITAL D;Lm;0;L; 1D05;;;;N;;;;; +1DFE9;MODIFIER LETTER SMALL CAPITAL A;Lm;0;L; 1D00;;;;N;;;;; +1DFEA;MODIFIER LETTER SMALL CAPITAL E;Lm;0;L; 1D07;;;;N;;;;; +1DFEB;MODIFIER LETTER SMALL REVERSED R WITH FISHHOOK;Lm;0;L; 027F;;;;N;;;;; +1DFEC;MODIFIER LETTER SMALL SQUAT REVERSED ESH;Lm;0;L; 0285;;;;N;;;;; +1DFED;MODIFIER LETTER SMALL TURNED H WITH FISHHOOK;Lm;0;L; 02AE;;;;N;;;;; +1DFEE;MODIFIER LETTER SMALL TURNED H WITH FISHHOOK AND TAIL;Lm;0;L; 02AF;;;;N;;;;; +1DFEF;MODIFIER LETTER SMALL D WITH CURL;Lm;0;L; 0221;;;;N;;;;; +1DFF0;MODIFIER LETTER SMALL L WITH CURL;Lm;0;L; 0234;;;;N;;;;; +1DFF1;MODIFIER LETTER SMALL N WITH CURL;Lm;0;L; 0235;;;;N;;;;; +1DFF2;MODIFIER LETTER SMALL T WITH CURL;Lm;0;L; 0236;;;;N;;;;; +1DFF3;MODIFIER LETTER SMALL GREEK PSI;Lm;0;L; 03C8;;;;N;;;;; +1DFF4;MODIFIER LETTER SMALL GREEK OMEGA;Lm;0;L; 03C9;;;;N;;;;; +1DFF5;MODIFIER LETTER SMALL D WITH PALATAL HOOK;Lm;0;L; 1D81;;;;N;;;;; +1DFF6;MODIFIER LETTER SMALL H WITH PALATAL HOOK;Lm;0;L; A795;;;;N;;;;; +1DFF7;MODIFIER LETTER SMALL N WITH PALATAL HOOK;Lm;0;L; 1D87;;;;N;;;;; +1DFF8;MODIFIER LETTER SMALL S WITH PALATAL HOOK;Lm;0;L; 1D8A;;;;N;;;;; +1DFF9;MODIFIER LETTER SMALL Z WITH PALATAL HOOK;Lm;0;L; 1D8E;;;;N;;;;; +1DFFA;MODIFIER LETTER SMALL C WITH HOOK;Lm;0;L; 0188;;;;N;;;;; +1DFFB;MODIFIER LETTER SMALL K WITH HOOK;Lm;0;L; 0199;;;;N;;;;; +1DFFC;MODIFIER LETTER SMALL P WITH HOOK;Lm;0;L; 01A5;;;;N;;;;; +1DFFD;MODIFIER LETTER SMALL Q WITH HOOK;Lm;0;L; 02A0;;;;N;;;;; +1DFFE;MODIFIER LETTER SMALL T WITH HOOK;Lm;0;L; 01AD;;;;N;;;;; +1DFFF;MODIFIER LETTER SMALL T WITH HOOK AND RETROFLEX HOOK;Lm;0;L; 1DF09;;;;N;;;;; 1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; 1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; 1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; @@ -37437,6 +38174,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; 1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;; 1F1AD;MASK WORK SYMBOL;So;0;ON;;;;;N;;;;; +1F1AE;TOMOBIKI SYMBOL;So;0;L;;;;;N;;;;; 1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; 1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; 1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; @@ -38512,6 +39250,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6D6;HUT;So;0;ON;;;;;N;;;;; 1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;; 1F6D8;LANDSLIDE;So;0;ON;;;;;N;;;;; +1F6D9;LIGHTHOUSE;So;0;ON;;;;;N;;;;; 1F6DC;WIRELESS;So;0;ON;;;;;N;;;;; 1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;; 1F6DE;WHEEL;So;0;ON;;;;;N;;;;; @@ -38760,6 +39499,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;; 1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;; 1F7D9;NINE POINTED WHITE STAR;So;0;ON;;;;;N;;;;; +1F7DA;BLACK CIRCLE WITH WHITE VERTICAL BAR;So;0;L;;;;;N;;;;; +1F7DB;BULLET IN DOUBLE CIRCLE;So;0;ON;;;;;N;;;;; 1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;; 1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;; 1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;; @@ -38773,6 +39514,21 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;; 1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;; 1F7F0;HEAVY EQUALS SIGN;So;0;ON;;;;;N;;;;; +1F7F1;CIRCLE WITH DOUBLE VERTICAL AND HORIZONTAL LINE;So;0;ON;;;;;N;;;;; +1F7F2;DOUBLE CIRCLE WITH DOUBLE HORIZONTAL LINE;So;0;ON;;;;;N;;;;; +1F7F3;CIRCLED BOTTOM RIGHT OBLIQUE HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1F7F4;LEFT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F7F5;RIGHT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F7F6;TRANSPARENT CUBE;So;0;ON;;;;;N;;;;; +1F7F7;WHITE CUBE;So;0;ON;;;;;N;;;;; +1F7F8;HORIZONTAL DOUBLE WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F7F9;VERTICAL DOUBLE WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F7FA;WHITE SQUARE WITH BOTTOM HALF BISECTED;So;0;ON;;;;;N;;;;; +1F7FB;WHITE SQUARE WITH TOP HALF BISECTED;So;0;ON;;;;;N;;;;; +1F7FC;WHITE SQUARE WITH HORIZONTAL AND VERTICAL BISECTING LINES;So;0;ON;;;;;N;;;;; +1F7FD;LOWER LEFT FLATTENED RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F7FE;LOWER RIGHT FLATTENED RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F7FF;RHOMBUS;So;0;ON;;;;;N;;;;; 1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; 1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; @@ -39326,6 +40082,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1FA88;FLUTE;So;0;ON;;;;;N;;;;; 1FA89;HARP;So;0;ON;;;;;N;;;;; 1FA8A;TROMBONE;So;0;ON;;;;;N;;;;; +1FA8B;METEOR;So;0;ON;;;;;N;;;;; +1FA8C;ERASER;So;0;ON;;;;;N;;;;; +1FA8D;NET WITH HANDLE;So;0;ON;;;;;N;;;;; 1FA8E;TREASURE CHEST;So;0;ON;;;;;N;;;;; 1FA8F;SHOVEL;So;0;ON;;;;;N;;;;; 1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;; @@ -39384,6 +40143,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;; 1FAC6;FINGERPRINT;So;0;ON;;;;;N;;;;; 1FAC8;HAIRY CREATURE;So;0;ON;;;;;N;;;;; +1FACC;MONARCH BUTTERFLY;So;0;ON;;;;;N;;;;; 1FACD;ORCA;So;0;ON;;;;;N;;;;; 1FACE;MOOSE;So;0;ON;;;;;N;;;;; 1FACF;DONKEY;So;0;ON;;;;;N;;;;; @@ -39400,6 +40160,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1FADA;GINGER ROOT;So;0;ON;;;;;N;;;;; 1FADB;PEA POD;So;0;ON;;;;;N;;;;; 1FADC;ROOT VEGETABLE;So;0;ON;;;;;N;;;;; +1FADD;PICKLE;So;0;ON;;;;;N;;;;; 1FADF;SPLATTER;So;0;ON;;;;;N;;;;; 1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;; 1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;; @@ -39412,6 +40173,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1FAE8;SHAKING FACE;So;0;ON;;;;;N;;;;; 1FAE9;FACE WITH BAGS UNDER EYES;So;0;ON;;;;;N;;;;; 1FAEA;DISTORTED FACE;So;0;ON;;;;;N;;;;; +1FAEB;CRACKING FACE;So;0;ON;;;;;N;;;;; 1FAEF;FIGHT CLOUD;So;0;ON;;;;;N;;;;; 1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;; 1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;; @@ -39422,6 +40184,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;; 1FAF7;LEFTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; 1FAF8;RIGHTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FAF9;LEFTWARDS THUMB SIGN;So;0;ON;;;;;N;;;;; +1FAFA;RIGHTWARDS THUMB SIGN;So;0;ON;;;;;N;;;;; 1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; 1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; 1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; @@ -39677,7 +40441,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 2A700;;Lo;0;L;;;;;N;;;;; 2B73F;;Lo;0;L;;;;;N;;;;; 2B740;;Lo;0;L;;;;;N;;;;; -2B81D;;Lo;0;L;;;;;N;;;;; +2B81E;;Lo;0;L;;;;;N;;;;; 2B820;;Lo;0;L;;;;;N;;;;; 2CEAD;;Lo;0;L;;;;;N;;;;; 2CEB0;;Lo;0;L;;;;;N;;;;; @@ -40232,6 +40996,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 323AF;;Lo;0;L;;;;;N;;;;; 323B0;;Lo;0;L;;;;;N;;;;; 33479;;Lo;0;L;;;;;N;;;;; +3D000;;Lo;0;L;;;;;N;;;;; +3FC3F;;Lo;0;L;;;;;N;;;;; E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; diff --git a/contrib/unicode/emoji-data.txt b/contrib/unicode/emoji-data.txt index 450252c4df3f..7a383f0dcfd6 100644 --- a/contrib/unicode/emoji-data.txt +++ b/contrib/unicode/emoji-data.txt @@ -1,11 +1,11 @@ # emoji-data.txt -# Date: 2025-07-25, 17:54:31 GMT -# © 2025 Unicode®, Inc. +# Date: 2026-01-30, 22:30:17 GMT +# © 2026 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use and license, see https://www.unicode.org/terms_of_use.html # # Emoji Data for UTS #51 -# Version: 17.0 +# Version: 18.0.0 # # For documentation and usage, see https://www.unicode.org/reports/tr51 # @@ -341,6 +341,7 @@ 1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple 1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator 1F6D8 ; Emoji # E17.0 [1] (🛘) landslide +1F6D9 ; Emoji # E18.0 [1] (🛙) lighthouse 1F6DC ; Emoji # E15.0 [1] (🛜) wireless 1F6DD..1F6DF ; Emoji # E14.0 [3] (🛝..🛟) playground slide..ring buoy 1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat @@ -410,6 +411,7 @@ 1FA87..1FA88 ; Emoji # E15.0 [2] (🪇..🪈) maracas..flute 1FA89 ; Emoji # E16.0 [1] (🪉) harp 1FA8A ; Emoji # E17.0 [1] (🪊) trombone +1FA8B..1FA8D ; Emoji # E18.0 [3] (🪋..🪍) meteor..net with handle 1FA8E ; Emoji # E17.0 [1] (🪎) treasure chest 1FA8F ; Emoji # E16.0 [1] (🪏) shovel 1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo @@ -425,22 +427,26 @@ 1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown 1FAC6 ; Emoji # E16.0 [1] (🫆) fingerprint 1FAC8 ; Emoji # E17.0 [1] (🫈) hairy creature +1FACC ; Emoji # E18.0 [1] (🫌) monarch butterfly 1FACD ; Emoji # E17.0 [1] (🫍) orca 1FACE..1FACF ; Emoji # E15.0 [2] (🫎..🫏) moose..donkey 1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot 1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar 1FADA..1FADB ; Emoji # E15.0 [2] (🫚..🫛) ginger root..pea pod 1FADC ; Emoji # E16.0 [1] (🫜) root vegetable +1FADD ; Emoji # E18.0 [1] (🫝) pickle 1FADF ; Emoji # E16.0 [1] (🫟) splatter 1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles 1FAE8 ; Emoji # E15.0 [1] (🫨) shaking face 1FAE9 ; Emoji # E16.0 [1] (🫩) face with bags under eyes 1FAEA ; Emoji # E17.0 [1] (🫪) distorted face +1FAEB ; Emoji # E18.0 [1] (🫫) cracking face 1FAEF ; Emoji # E17.0 [1] (🫯) fight cloud 1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands 1FAF7..1FAF8 ; Emoji # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand +1FAF9..1FAFA ; Emoji # E18.0 [2] (🫹..🫺) leftwards thumb sign..rightwards thumb sign -# Total elements: 1438 +# Total elements: 1447 # ================================================ @@ -648,6 +654,7 @@ 1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple 1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator 1F6D8 ; Emoji_Presentation # E17.0 [1] (🛘) landslide +1F6D9 ; Emoji_Presentation # E18.0 [1] (🛙) lighthouse 1F6DC ; Emoji_Presentation # E15.0 [1] (🛜) wireless 1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (🛝..🛟) playground slide..ring buoy 1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival @@ -713,6 +720,7 @@ 1FA87..1FA88 ; Emoji_Presentation # E15.0 [2] (🪇..🪈) maracas..flute 1FA89 ; Emoji_Presentation # E16.0 [1] (🪉) harp 1FA8A ; Emoji_Presentation # E17.0 [1] (🪊) trombone +1FA8B..1FA8D ; Emoji_Presentation # E18.0 [3] (🪋..🪍) meteor..net with handle 1FA8E ; Emoji_Presentation # E17.0 [1] (🪎) treasure chest 1FA8F ; Emoji_Presentation # E16.0 [1] (🪏) shovel 1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo @@ -728,22 +736,26 @@ 1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown 1FAC6 ; Emoji_Presentation # E16.0 [1] (🫆) fingerprint 1FAC8 ; Emoji_Presentation # E17.0 [1] (🫈) hairy creature +1FACC ; Emoji_Presentation # E18.0 [1] (🫌) monarch butterfly 1FACD ; Emoji_Presentation # E17.0 [1] (🫍) orca 1FACE..1FACF ; Emoji_Presentation # E15.0 [2] (🫎..🫏) moose..donkey 1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot 1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar 1FADA..1FADB ; Emoji_Presentation # E15.0 [2] (🫚..🫛) ginger root..pea pod 1FADC ; Emoji_Presentation # E16.0 [1] (🫜) root vegetable +1FADD ; Emoji_Presentation # E18.0 [1] (🫝) pickle 1FADF ; Emoji_Presentation # E16.0 [1] (🫟) splatter 1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles 1FAE8 ; Emoji_Presentation # E15.0 [1] (🫨) shaking face 1FAE9 ; Emoji_Presentation # E16.0 [1] (🫩) face with bags under eyes 1FAEA ; Emoji_Presentation # E17.0 [1] (🫪) distorted face +1FAEB ; Emoji_Presentation # E18.0 [1] (🫫) cracking face 1FAEF ; Emoji_Presentation # E17.0 [1] (🫯) fight cloud 1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands 1FAF7..1FAF8 ; Emoji_Presentation # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand +1FAF9..1FAFA ; Emoji_Presentation # E18.0 [2] (🫹..🫺) leftwards thumb sign..rightwards thumb sign -# Total elements: 1219 +# Total elements: 1228 # ================================================ @@ -807,8 +819,9 @@ 1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown 1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands 1FAF7..1FAF8 ; Emoji_Modifier_Base # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand +1FAF9..1FAFA ; Emoji_Modifier_Base # E18.0 [2] (🫹..🫺) leftwards thumb sign..rightwards thumb sign -# Total elements: 134 +# Total elements: 136 # ================================================ @@ -954,7 +967,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..c 1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button 1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type) 1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button -1F1AE..1F1E5 ; Extended_Pictographic# E0.0 [56] (🆮..🇥) .. +1F1AF..1F1E5 ; Extended_Pictographic# E0.0 [55] (🆯..🇥) .. 1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button 1F203..1F20F ; Extended_Pictographic# E0.0 [13] (🈃..🈏) .. 1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button @@ -1160,7 +1173,8 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..c 1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple 1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator 1F6D8 ; Extended_Pictographic# E17.0 [1] (🛘) landslide -1F6D9..1F6DB ; Extended_Pictographic# E0.0 [3] (🛙..🛛) .. +1F6D9 ; Extended_Pictographic# E18.0 [1] (🛙) lighthouse +1F6DA..1F6DB ; Extended_Pictographic# E0.0 [2] (🛚..🛛) .. 1F6DC ; Extended_Pictographic# E15.0 [1] (🛜) wireless 1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (🛝..🛟) playground slide..ring buoy 1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat @@ -1175,11 +1189,10 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..c 1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw 1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate 1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (🛽..🛿) .. -1F7DA..1F7DF ; Extended_Pictographic# E0.0 [6] (🟚..🟟) .. +1F7DC..1F7DF ; Extended_Pictographic# E0.0 [4] (🟜..🟟) .. 1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square 1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (🟬..🟯) .. 1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign -1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (🟱..🟿) .. 1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..🠏) .. 1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..🡏) .. 1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) .. @@ -1246,7 +1259,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..c 1FA87..1FA88 ; Extended_Pictographic# E15.0 [2] (🪇..🪈) maracas..flute 1FA89 ; Extended_Pictographic# E16.0 [1] (🪉) harp 1FA8A ; Extended_Pictographic# E17.0 [1] (🪊) trombone -1FA8B..1FA8D ; Extended_Pictographic# E0.0 [3] (🪋..🪍) .. +1FA8B..1FA8D ; Extended_Pictographic# E18.0 [3] (🪋..🪍) meteor..net with handle 1FA8E ; Extended_Pictographic# E17.0 [1] (🪎) treasure chest 1FA8F ; Extended_Pictographic# E16.0 [1] (🪏) shovel 1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo @@ -1263,26 +1276,30 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..c 1FAC6 ; Extended_Pictographic# E16.0 [1] (🫆) fingerprint 1FAC7 ; Extended_Pictographic# E0.0 [1] (🫇) 1FAC8 ; Extended_Pictographic# E17.0 [1] (🫈) hairy creature -1FAC9..1FACC ; Extended_Pictographic# E0.0 [4] (🫉..🫌) .. +1FAC9..1FACB ; Extended_Pictographic# E0.0 [3] (🫉..🫋) .. +1FACC ; Extended_Pictographic# E18.0 [1] (🫌) monarch butterfly 1FACD ; Extended_Pictographic# E17.0 [1] (🫍) orca 1FACE..1FACF ; Extended_Pictographic# E15.0 [2] (🫎..🫏) moose..donkey 1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot 1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar 1FADA..1FADB ; Extended_Pictographic# E15.0 [2] (🫚..🫛) ginger root..pea pod 1FADC ; Extended_Pictographic# E16.0 [1] (🫜) root vegetable -1FADD..1FADE ; Extended_Pictographic# E0.0 [2] (🫝..🫞) .. +1FADD ; Extended_Pictographic# E18.0 [1] (🫝) pickle +1FADE ; Extended_Pictographic# E0.0 [1] (🫞) 1FADF ; Extended_Pictographic# E16.0 [1] (🫟) splatter 1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles 1FAE8 ; Extended_Pictographic# E15.0 [1] (🫨) shaking face 1FAE9 ; Extended_Pictographic# E16.0 [1] (🫩) face with bags under eyes 1FAEA ; Extended_Pictographic# E17.0 [1] (🫪) distorted face -1FAEB..1FAEE ; Extended_Pictographic# E0.0 [4] (🫫..🫮) .. +1FAEB ; Extended_Pictographic# E18.0 [1] (🫫) cracking face +1FAEC..1FAEE ; Extended_Pictographic# E0.0 [3] (🫬..🫮) .. 1FAEF ; Extended_Pictographic# E17.0 [1] (🫯) fight cloud 1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands 1FAF7..1FAF8 ; Extended_Pictographic# E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand -1FAF9..1FAFF ; Extended_Pictographic# E0.0 [7] (🫹..🫿) .. +1FAF9..1FAFA ; Extended_Pictographic# E18.0 [2] (🫹..🫺) leftwards thumb sign..rightwards thumb sign +1FAFB..1FAFF ; Extended_Pictographic# E0.0 [5] (🫻..🫿) .. 1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) .. -# Total elements: 2848 +# Total elements: 2830 #EOF diff --git a/contrib/unicode/gen_libstdcxx_unicode_data.py b/contrib/unicode/gen_libstdcxx_unicode_data.py index f5f3ab282481..91cb201e1ff6 100755 --- a/contrib/unicode/gen_libstdcxx_unicode_data.py +++ b/contrib/unicode/gen_libstdcxx_unicode_data.py @@ -64,7 +64,7 @@ """) print("#ifndef _GLIBCXX_GET_UNICODE_DATA") print('# error "This is not a public header, do not include it directly"') -print("#elif _GLIBCXX_GET_UNICODE_DATA != 160000") +print("#elif _GLIBCXX_GET_UNICODE_DATA != 180000") print('# error "Version mismatch for Unicode static data"') print("#endif\n") diff --git a/fixincludes/ChangeLog b/fixincludes/ChangeLog index 107692d75083..d926935ba13b 100644 --- a/fixincludes/ChangeLog +++ b/fixincludes/ChangeLog @@ -1,3 +1,8 @@ +2026-09-20 Iain Sandoe + + * fixincl.x: Regenerate. + * inclhack.def: Allow for math.h in architecture/ in SDKs. + 2026-06-29 Pietro Monteiro PR bootstrap/103459 diff --git a/fixincludes/fixincl.x b/fixincludes/fixincl.x index 9db4d376a2e3..2045fad33afc 100644 --- a/fixincludes/fixincl.x +++ b/fixincludes/fixincl.x @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (fixincl.x) * - * It has been AutoGen-ed February 15, 2026 at 11:11:08 PM by AutoGen 5.18.12 + * It has been AutoGen-ed September 19, 2026 at 10:38:43 AM by AutoGen 5.18.16 * From the definitions inclhack.def * and the template file fixincl */ -/* DO NOT MERGE THIS FILE, EITHER Sun Feb 15 23:11:08 CET 2026 +/* DO NOT MERGE THIS FILE, EITHER Sat Sep 19 10:38:43 BST 2026 * * You must regenerate it. Use the ./genfixes script. * @@ -3665,7 +3665,7 @@ tSCC zDarwin_Flt_Eval_MethodName[] = * File name selection pattern */ tSCC zDarwin_Flt_Eval_MethodList[] = - "math.h\0"; + "math.h\0architecture/i386/math.h\0architecture/ppc/math.h\0"; /* * Machine/OS name selection pattern */ diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def index 20a7e8ef9772..3bbcb2ce25e3 100644 --- a/fixincludes/inclhack.def +++ b/fixincludes/inclhack.def @@ -1806,7 +1806,7 @@ fix = { fix = { hackname = darwin_flt_eval_method; mach = "*-*-darwin*"; - files = math.h; + files = math.h, architecture/i386/math.h, architecture/ppc/math.h; select = "^#if __FLT_EVAL_METHOD__ == 0( \\|\\| __FLT_EVAL_METHOD__ == -1)?$"; c_fix = format; c_fix_arg = "%0 || __FLT_EVAL_METHOD__ == 16"; diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd78d1b98f2b..e10db01885e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,1722 @@ +2026-09-28 Robin Dapp + + PR target/127075 + * config/riscv/riscv-vector-costs.cc (compute_estimated_lmul): + Rename... + (estimate_lmul): ...To this. + (compute_lmul_from_conversion_ratio): Remove. + (costs::compute_live_ranges_and_lmul): Remove param. + (costs::compute_conversion_dynamic_lmul): Remove. + (costs::has_unexpected_spills_p): Rename... + (costs::has_spills_p): ...To This. + (costs::record_lmul_spills): Adjust comment. + (costs::record_potential_unexpected_spills): Rename... + (costs::record_potential_spills): ...To this. + (costs::compare_lmul_to): New function. + (costs::better_main_loop_than_p): Call new function. + (costs::record_type_sizes): New function. + (costs::add_stmt_cost): Call new function. + (costs::finish_cost): Compute type ratio for LMUL. + * config/riscv/riscv-vector-costs.h: Declare new function. + +2026-09-28 Robin Dapp + + PR target/127553 + * config/riscv/riscv-vector-builtins.cc (validate_instance_type_required_extensions): + Add location param for logging. + (expand_builtin): Pass location. + (check_builtin_call): Likewise. + +2026-09-28 Robin Dapp + + PR target/127484 + PR target/127547 + * config/riscv/riscv.cc (riscv_subpart): Add parameters and + handle more part sizes. + (spill_subreg_move): Allow subreg bytes != 0. + (riscv_split_quadword_move): Use riscv_subpart for TFmode. + * config/riscv/riscv.md (movtf): Add. + +2026-09-28 Georg-Johann Lay + + * config/avr/avr.opt.urls: Fix moptimize link. + * config/nvptx/nvptx.opt.urls: Same. + +2026-09-28 Bohan Lei + + * config/riscv/riscv-vector-costs.cc (get_pattern_var): New + function. + (costs::compute_local_live_ranges): Replace the argument with + the pattern result when necessary. + +2026-09-28 Andrew MacLeod + + PR tree-optimization/126531 + * gimple-range-cache.cc (ranger_cache::apply_inferred_ranges): Do not + update if there are abnormal edges. + +2026-09-28 Andrew MacLeod + + PR tree-optimization/127203 + * gimple-range-cache.cc (ranger_cache::range_from_dom): Mark both + outgoing edges and inferred ranges as "to calculate". + +2026-09-28 Tobias Burnus + + * config/gcn/gcn-devices.def: Add gfx1154. + * config/gcn/gcn-tables.opt: Regenerate. + * doc/invoke.texi (-march=): Add gfx1154. + +2026-09-28 Naveen + + PR target/126245 + * config/riscv/riscv.md (negcc): Add an expansion for + conditional negation of integral values. + +2026-09-28 Stian Halseth + + PR rtl-optimization/127578 + * doc/sourcebuild.texi (cbcond_hw): Document. + * ifcvt.cc (find_cond_trap): Reject a sequence that clobbers a + condition-code register live out of TEST_BB. + +2026-09-27 Tamar Christina + + PR tree-optimization/118407 + * tree-vect-loop.cc (vect_update_early_break_profiles): New. + (scale_profile_for_vect_loop): Use it and pass loop_vinfo. + (vect_transform_loop): Pass loop_vinfo to scale_profile_for_vect_loop. + +2026-09-27 Roger Sayle + + PR target/127267 + * config/iq2000/iq2000.h (SMALL_INT): Fix trivial parenthesis goof. + * config/iq2000/iq2000.cc (iq2000_move_1word): Eliminate useless + IOR with 0x0 operand. + * config/iq2000/iq2000.md (aopsi3): New expander. + (32 bit integer move splitter): Turn low part IOR into a copy when + the constant is zero. + +2026-09-27 Dominic P + + PR target/69374 + * doc/install.texi (Microsoft Windows): Remove the Windows CE + subsection. + +2026-09-27 wangjue + + * tree-vect-patterns.cc (vect_sat_trunc_clip_input_vectype): New. + (vect_recog_sat_trunc_pattern): Look through promotions and check + target support for MAX_EXPR. + +2026-09-27 Iain Sandoe + + * config/darwin.cc (machopic_select_section): Do not try to + inspect a typename which has no id. + +2026-09-27 Samarth Tandale + + PR tree-optimization/112094 + * match.pd: Add fold for (a != 0) | (popcount(a) == n) and + (a == 0) & (popcount(a) != n). + +2026-09-27 James K. Lowden + + * config/avr/avr.opt.urls: Regenerate. + * config/nvptx/nvptx.opt.urls: Regenerate. + +2026-09-27 Jeff Law + + PR tree-optimization/126462 + * match.pd (reassociate xor to expose rotate patterns): Rewrite using + wi:: interfaces for the xor constant operand. + +2026-09-27 Gerald Pfeifer + + PR target/69374 + * doc/install.texi (Specific): No longer mention Windows NT on + Alpha and PowerPC. + +2026-09-26 Tamar Christina + + PR tree-optimization/127618 + * fold-const.cc (test_vec_unpack_folding): Update tests + +2026-09-26 Tobias Burnus + + * config/nvptx/nvptx.cc (nvptx_encode_section_info): Handle + 'omp groupprivate'. + * varpool.cc (varpool_node::get_create): Print sorry for + 'omp groupprivate' variables except for device_type(nohost) and + no offloading or nvptx offloading. + +2026-09-26 Oleg Tolmatcev + + PR debug/119940 + * dwarf2codeview.cc (codeview_start_source_file): Open the source file + in binary mode. + +2026-09-25 Dominic P + + * config/aarch64/aarch64-simd.md + (aarch64_rsra_n_insn): Take the shift amount in + mode. + (aarch64_rsra_n): Build the shift amount vector in + that mode. + (aarch64_rshr_n_insn): Take the shift + amount in mode. + (aarch64_rshr_n): Build the shift amount vector in + that mode. + +2026-09-25 Dominic P + + * config/aarch64/aarch64-simd.md + (*aarch64_rshrn_n_insn): New pattern. + (*aarch64_rshrn2_n_insn_le): Likewise. + (*aarch64_rshrn2_n_insn_be): Likewise. + +2026-09-25 Dominic P + + * config/aarch64/predicates.md (aarch64_simd_umax_half_mode) + (aarch64_simd_umax_quarter_mode): Remove. + * config/aarch64/aarch64-simd.md (aarch64_sqmovun) + (*aarch64_sqmovun_insn) + (aarch64_sqxtun2_le, aarch64_sqxtun2_be) + (aarch64_sqxtun2) + (*aarch64_sqshrun_n_insn) + (aarch64_sqshrun_n) + (*aarch64_sqrshrun_n_insn) + (aarch64_sqrshrun_n, aarch64_sqshrun2_n_insn_le) + (aarch64_sqshrun2_n_insn_be, aarch64_sqshrun2_n) + (aarch64_sqrshrun2_n_insn_le) + (aarch64_sqrshrun2_n_insn_be, aarch64_sqrshrun2_n): + Match an us_truncate of an smax instead of a truncate of an smin + of an smax. + +2026-09-25 Michiel Derhaeg + + * config/riscv/arcv-rmx100.md (arcv_rmx100_load_insn): + Update latency. + (arcv_rmx100_fpload_insn): Merge with *_load_insn. + +2026-09-25 Andrea Pinski + + PR middle-end/127602 + * except.h (struct eh_catch_d): Add chain_next and chain_prev + GTY. + +2026-09-25 Andrea Pinski + + PR middle-end/127602 + * except.h (struct eh_region_d): Add chain_next GTY. + +2026-09-25 Aldy Hernandez + + PR tree-optimization/127485 + * range-op-mixed.h (class operator_minus): Add op1_op2_relation. + * range-op.cc (operator_minus::op1_op2_relation): New. + * gimple-range-fold.cc (fur_source::register_outgoing_edges): + Derive relations from any integral export, not just booleans. + +2026-09-25 Vladimir N. Makarov + + PR rtl-optimization/127326 + * lra-constraints.cc (process_alt_operands): Resolve the operand + to memory when it is a winning MEM and the value can be held in a + register. + +2026-09-25 Tobias Burnus + + PR lto/127589 + * lto-streamer-in.cc (lto_input_mode_table): With ACCEL_COMPILER, + check whether found float and int modes are actually enabled/available + at runtime. + +2026-09-25 Roger Sayle + + * simplify-rtx.cc (simplify_binary_operation_1) : + Add transformations for multiplications by one and powers to two. + : Likewise. + +2026-09-25 Wilco Dijkstra + + PR target/112465 + * config/aarch64/aarch64.cc (aarch64_override_options_after_change_1): + Turn off outline atomics with -mcmodel=large. + * doc/invoke.texi (-mcmodel=large): Update description. + +2026-09-25 Oleg Tolmatcev + + PR target/54412 + * except.cc (sjlj_build_landing_pads): Pass ASLK_REDUCE_ALIGN. + * function.cc (assign_stack_local_2): New function, split from + assign_stack_local_1. Honour an explicit alignment beyond + MAX_SUPPORTED_STACK_ALIGNMENT by overallocating the slot and aligning + its address at run time. Optionally return the address before run-time + alignment. + (assign_stack_local_1): Wrap assign_stack_local_2. + (temp_slot): Add base_addr. + (assign_stack_temp_for_type): Distinguish required and preferred + alignment. Record the address before run-time alignment and recalculate + the aligned address when reusing an over-aligned slot. Do not split an + over-aligned BLKmode slot. + (combine_temp_slots): Do not combine over-aligned slots. + (assign_parm_setup_block): Let assign_stack_local align the slot. + * lra-spills.cc (assign_mem_slot): Pass ASLK_REDUCE_ALIGN. + +2026-09-25 Richard Biener + + PR tree-optimization/127588 + * tree-vect-loop-manip.cc (vect_update_ivs_after_vectorizer): + Use an unsigned type to compute the epilog start value. + +2026-09-25 Surya Kumari Jangala + + PR rtl-optimization/106770 + * config/rs6000/rs6000-p8swap.cc (non_permuting_mem_insn): New function. + (handle_non_permuting_mem_insn): New function. + (rs6000_analyze_swaps): Handle swappable instructions only in certain + webs. + (web_requires_special_handling): New instance variable. + (handle_special_swappables): Remove handling of non-permuting load/store + instructions. + +2026-09-25 Andrew Stubbs + + * config/gcn/gcn-valu.md (mul3): Remove erroneous hi*hi step. + (mul3_dup): Likewise. + (mul3_exec): Likewise. + (mul3_dup_exec): Likewise. + +2026-09-25 Richard Biener + + PR tree-optimization/127601 + * tree-vect-stmts.cc (get_load_store_type): Move overrun + flags and final handling to the relevant section, after + determining the step direction and the memory access type. + Only elide overrun with half-vector accesses for the + memory access types supporting that. Do not claim + VMAT_STRIDED_SLP can handle overruns when the step is + negative. + (vectorizable_load): For the last memory access type group + analysis/transform assert what memory access type that covers. + +2026-09-25 Georg-Johann Lay + + * config/avr/avr.opt.urls: Fix moptimize link. + +2026-09-25 Richard Biener + + PR tree-optimization/127600 + * tree-vect-loop.cc (vect_is_simple_iv_evolution): Explicitly + initialize STMT_VINFO_LOOP_PHI_EVOLUTION_TYPE. + (is_nonwrapping_integer_induction): Bail out for alternate + induction types. + +2026-09-25 Jakub Jelinek + + PR middle-end/127517 + * internal-fn.cc (expand_mul_overflow): Revert the 2023-09-06 + changes. Instead promote arg0 and/or arg1 to a type with + uns{0,1}_p signedness and mode precision if they have non-mode + precision. Pass the original arg0/arg1 and their type to + ubsan_build_overflow_builtin, instead of passing the promoted + ones. + +2026-09-25 Georg-Johann Lay + + * config/avr/avr.opt (-moptimize): New target option. + * config/avr/avr.opt.urls: Add resprective URL. + * common/config/avr/avr-common.cc (avr_enable_optimizations): New + static function. + (avr_handle_option) [OPT_moptimize]: Call it. + * doc/invoke.texi (AVR Options) <-moptimize>: Document it. + +2026-09-25 Artemiy Volkov + + PR tree-optimization/127552 + * match.pd: Fix constant comparison in ((X >> C1) & C2) << C3. + +2026-09-25 Andrea Pinski + + PR target/127599 + * config/aarch64/aarch64.cc (aarch64_evpc_rev64_ext): Move + the testing_p after the is_bb_in_loop test. + +2026-09-24 Jakub Jelinek + + PR c++/126848 + * flag-types.h (enum auto_init_type): Change AUTO_INIT_CXX26 + value from 3 to 4. + * gimplify.cc (gimplify_decl_expr): Mask off AUTO_INIT_CXX26 bit + before comparing to AUTO_INIT_PATTERN. + (gimplify_target_expr): Likewise. + * internal-fn.cc (expand_DEFERRED_INIT): Likewise. Formatting fix. + * opts.cc (finish_options): For -fhardened or in AUTO_INIT_CXX26 + bit from previous value if it was set. Mask off AUTO_INIT_CXX26 bit + before comparing to AUTO_INIT_ZERO. + * tree-ssa-ccp.cc (likely_value): Return VARYING rather than UNDEFINED + for .DEFERRED_INIT call with AUTO_INIT_CXX26 bit set in the second + argument. + * tree-ssa.cc (ssa_undefined_value_p): Return false rather than true + for .DEFERRED_INIT call with AUTO_INIT_CXX26 bit set in the second + argument. + * tree-ssa-uninit.cc (has_undefined_value_p): Return true for + SSA_NAMEs with .DEFERRED_INIT call as SSA_NAME_DEF_STMT. + +2026-09-24 Paul-Antoine Arras + + * tree-pretty-print.cc (dump_omp_iterators): Print OMP_ITERATOR_BLOCK. + +2026-09-24 Andrew Stubbs + + * gdbhooks.py (Rtx): Decode more things. + (RtxPrinter): Improve output. + (build_pretty_printer): Match more rtx types. + +2026-09-24 Andrew Stubbs + + PR target/127542 + * config/gcn/gcn-valu.md (2): Add + "popcount_extra_op". + +2026-09-24 Tamar Christina + + PR tree-optimization/127579 + * tree-vect-loop.cc (info_for_reduction): Add assert. + * tree-vect-stmts.cc (vectorizable_operation): Pass SLP node. + +2026-09-24 Kyrylo Tkachov + + * config/i386/i386-features.cc + (rest_of_insert_endbr_and_patchable_area): + Reuse an existing ENDBR. + +2026-09-24 Uros Bizjak + + * doc/install.texi (Installing GCC): Change node pointer from + Binaries to Specific. + (Specific): Move to directly follow Installing GCC. + Update node pointers accordingly. + (Binaries): Move to follow Specific. + Update node pointers accordingly. + * doc/include/fdl.texi (GNU Free Documentation License): Under + @ifset gfdlhtml, change node pointer from Specific to Binaries + to match install.texi's chapter order. + +2026-09-24 Richard Biener + + PR target/127268 + * config/i386/i386.cc (ix86_default_vector_cost): For + integer mode vec_to_scalar add sse_to_integer cost. + +2026-09-24 Richard Biener + + PR tree-optimization/127571 + * tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): + Re-associate offset computation to avoid overflow. + +2026-09-24 Pan Li + + * config/riscv/vector.md: Leverage Wvr constraint. + +2026-09-23 Jeff Law + + * config/v850/v850.cc (v850_print_oprerand): Handle operands + like (high (const ...)) by stripping the high and falling into + the (const ...) case. + +2026-09-23 Vijay Shankar + + PR target/27479 + * config/rs6000/rs6000.md (tprel_ld__): New pattern. + (tprel_ld_QI_signed): likewise. + (tprel_ld_QI): likewise. + (tprel_ld_DI): likewise. + (tprel_ld_): likewise. + +2026-09-23 Richard Biener + + * tree-vect-stmts.cc (vectorizable_load): Cost non-uniform + invariant loads more appropriately. + +2026-09-23 Tamar Christina + + * fold-const.cc (const_unop): Fold VEC_UNPACK_LO_EXPR and + VEC_UNPACK_HI_EXPR for suitable variable-length VECTOR_CSTs. + (selftest::test_vec_unpack_folding): New function. + (selftest::fold_const_cc_tests): Call it. + +2026-09-23 Tamar Christina + + * config/aarch64/aarch64.cc (aarch64_ifn_vect_stmt_p): New function. + (aarch64_adjust_stmt_cost): Account for extra Adv.SIMD SAD and ABD + reduction costs. + (aarch64_vector_costs::count_ops): Likewise. + +2026-09-23 Tamar Christina + + * config/aarch64/aarch64.cc (aarch64_vect_vf_for_cost): New + function. + (aarch64_vector_costs::adjust_body_cost): Use it. + (aarch64_vector_costs::better_main_loop_than_p): Likewise. + +2026-09-23 Matthias Kretz + + * config/i386/sse.md (roundeven2): New. + +2026-09-22 Chung-Lin Tang + + * omp-offload.cc (omp_discover_implicit_declare_target): + For self_maps/unified_shared_memory case, adjust to not convert + 'omp declare target local' variables to 'link'. + * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_LOCAL. + * tree.cc (omp_clause_num_ops): Add entry for OMP_CLAUSE_LOCAL. + (omp_clause_code_name): Likewise. + * varpool.cc (varpool_node::get_create): Do not add variable to + offload_vars if "local" argument is present in "omp declare target". + +2026-09-22 Vladimir N. Makarov + + PR rtl-optimization/127326 + * lra-constraints.cc (process_alt_operands): Ignore register if + constraint describes memory and register which can not hold the + mode value. + +2026-09-22 Roger Sayle + Hongtao Liu + + PR target/114544 + * config/i386/constraints.md (YD): New constraint, like Yd but + allows SSE_REGS on TARGET_SSE2. + * config/i386/i386.cc (inline_secondary_memory_needed): Update + that TImode moves to GENERAL_REGS don't need to use memory. + * config/i386/i386.md (*movti_internal): Change Yd constraint to YD. + (define_split): On TARGET_64BIT && TARGET_SSE2 && !TARGET_SSE4_1, + split *movti_internal into movq+shufpd+movq+shufpd. + +2026-09-22 Richard Earnshaw + + PR target/127393 + * config/aarch64/predicates.md (pure_register_operand): New predicate. + * config/aarch64/aarch64.md (negvti3): Use it. + +2026-09-22 Jakub Jelinek + + PR middle-end/127492 + * builtins.cc (expand_builtin_atomic_fetch_op): Force val into a + pseudo if updates to mem could change its value. + (expand_ifn_atomic_bit_test_and): Likewise. + +2026-09-22 Richard Biener + + * tree-vect-loop.cc (vectorizable_live_operation): Cost + the lane extract in vect_body for BB vectorization and + in vect_epilog for loop vectorization. + +2026-09-22 Richard Biener + + * doc/invoke.texi (fwrapv-pointer): Add disclaimer. + (fno-strict-overflow): Discourage, suggest fwrapv. + +2026-09-22 Andrew Stubbs + + * target.def (base_reg_class): New target hook. + * targhooks.h (default_base_reg_class): Declare. + * targhooks.cc (default_base_reg_class): New function, implementing + the previous BASE_REG_CLASS/MODE_BASE_REG_CLASS/ + MODE_BASE_REG_REG_CLASS/MODE_CODE_BASE_REG_CLASS macro fallback + chain as the hook's default. + * addresses.h (base_reg_class): Rewrite to call the + TARGET_BASE_REG_CLASS hook instead of dispatching through + INSN_BASE_REG_CLASS and the other macros by hand; add a MEM + parameter. + * rtl.h (address_info): Add mem field. + * rtlanal.cc (decompose_mem_address): Set it. + * lra-constraints.cc (simplify_operand_subreg, process_alt_operands, + base_to_reg, base_plus_disp_to_reg, process_address_1, + curr_insn_transform): Pass the enclosing MEM, and INSN where + previously omitted, to base_reg_class. + * reload.cc (find_reloads, find_reloads_address, + find_reloads_address_1, find_reloads_subreg_address): Likewise. + * reload1.cc (maybe_fix_stack_asms): Likewise. + * regcprop.cc: Include target.h. + (replace_oldest_value_addr, replace_oldest_value_mem): Pass MEM to + base_reg_class. + * regrename.cc (base_reg_class_for_rename): Add a MEM parameter. + (scan_rtx_address, scan_rtx): Pass it. + * caller-save.cc: Include target.h. + * config/i386/i386.h (INSN_BASE_REG_CLASS): Delete. + * config/i386/i386-protos.h (ix86_insn_base_reg_class): Delete + declaration. + * config/i386/i386.cc (ix86_insn_base_reg_class): Rename to... + (ix86_base_reg_class): ...this, adjust the signature, and implement + TARGET_BASE_REG_CLASS instead of INSN_BASE_REG_CLASS. + (TARGET_BASE_REG_CLASS): Define. + * doc/tm.texi.in: Add TARGET_BASE_REG_CLASS. Mark BASE_REG_CLASS, + MODE_BASE_REG_CLASS, MODE_BASE_REG_REG_CLASS and + MODE_CODE_BASE_REG_CLASS as obsolete in favor of the new hook, and + remove the now-unused INSN_BASE_REG_CLASS. + * doc/tm.texi: Regenerate. + +2026-09-22 Wilco Dijkstra + + * config/aarch64/atomics.md (atomic_store): Use aarch64_reg_or_zero. + +2026-09-22 liuhongt + + PR tree-optimization/126486 + * tree-affine.cc: Include vr-values.h. + (aff_combination_convert): Accept and propagate range context. + (expr_to_aff_combination): Likewise. Fold sign-changing conversions + and negative unsigned offsets. + (tree_to_aff_combination): Accept and propagate range context. + * tree-affine.h (aff_combination_convert): Update declaration. + (tree_to_aff_combination): Likewise. + * tree-ssa-loop-ivopts.cc: Include gimple-range.h. + (get_computation_aff_1): Pass the use statement. + (tree_ssa_iv_optimize): Enable ranger. + +2026-09-22 liuhongt + + PR target/127500 + * config/i386/i386.cc (ix86_split_stlf_stall_load): Don't split + the load when the address adjusted by 8 is not a valid memory + address. + +2026-09-22 Naveen + + PR tree-optimization/112626 + * match.pd: Fold comparisons between abs (x) and x including + unsigned conversions of both operands. + +2026-09-22 Pan Li + + PR target/127269 + * config/riscv/riscv-v.cc (riscv_v_widen_constraint_ok): Return + false instead of assertion when the nregs of the dest is less + than that of the src. + +2026-09-22 Pan Li + + * config/riscv/constraints.md (Wn4): New constraint for the + vector register which doesn't overlap the register group of + the operand 4. + * config/riscv/vector.md: Take the Wn4 constraint for the + operand 3 and the Wvr constraint for the operand 4 of the + vfwadd.wv. + +2026-09-21 Eric Botcazou + + * config/riscv/riscv.cc (riscv_flatten_aggregate_field) : + Perform the computation of the number of elements using the precision + of the index type instead of using HOST_WIDE_INT. + +2026-09-21 Eric Botcazou + + * tree-loop-distribution.cc (loop_distribution::classify_partition): + Disqualify the partition for builtins it it contains nonaddressable + data references. + +2026-09-21 Eric Botcazou + + * dwarf2out.h (struct array_descr_info): Add reverse_storage_order. + * dwarf2out.cc (gen_descr_array_type_die): Pass it in the call to + add_type_attribute instead of using TYPE_REVERSE_STORAGE_ORDER. + +2026-09-21 Ancheng.Qiao + + * config/riscv/riscv.cc (riscv_expand_prologue): Fold into the + cm.push reserve only as many callee-saved FPRs as it can hold by + dividing the additional reserve by UNITS_PER_FP_REG. + (riscv_expand_epilogue): Likewise. + +2026-09-21 Matt Turner + + PR middle-end/66462 + * builtins.cc (fold_builtin_fpclassify): Expand using the + classification built-ins when their optabs are available. + +2026-09-21 Matt Turner + + PR middle-end/66462 + * config/aarch64/aarch64.md (cmp_swp__reg): Add a + parameterized name. + (isinf2): Use GPF_HF_BF and handle the 16-bit formats. + (isfinite2): Likewise. + (isnan2): Likewise. + +2026-09-21 Matt Turner + + PR middle-end/66462 + * config/aarch64/aarch64.md (isnormal2): Add new expander. + * config/aarch64/iterators.md (GPF_HF_BF): New mode iterator. + (mantissa_bits): Add HF and BF. + (V_INT_EQUIV): Add BF. + +2026-09-21 Matt Turner + + * config/aarch64/aarch64.md (*extend2_aarch64): + Guard the smov alternative with base_simd rather than fp. + (*zero_extend2_aarch64): Likewise for umov. + +2026-09-21 Matt Turner + + PR middle-end/66462 + * config/alpha/alpha-protos.h (enum alpha_fp_class): New. + (alpha_expand_fp_classify): Declare. + * config/alpha/alpha.cc (alpha_expand_fp_classify): New function. + * config/alpha/alpha.md (isfinite2, isinf2) + (isnan2, isnormal2): New expanders. + +2026-09-21 Richard Biener + Claude Opus 5 + + PR tree-optimization/113703 + PR tree-optimization/127515 + * tree-ssa-loop-ivopts.cc (iv_elimination_compare_lt): Also record + A + 1 when matching the number of iterations. Convert it to OFF_TYPE + as a whole, compute B + 1 in OFF_TYPE and require both to be + non-negative scaled offsets that do not overflow. Build the bound + out of them instead of A and B. + +2026-09-21 Alfie Richards + + PR target/127494 + * config/riscv/riscv-v.cc (autovectorize_vector_modes): + Restore previous behaviour. + +2026-09-21 Richard Biener + + PR tree-optimization/127475 + * tree-vect-loop.cc (vectorizable_induction): Use + signed_or_unsigned_type_for to get the step vectype. + +2026-09-21 Richard Biener + + PR ipa/127479 + * lto-streamer-out.cc (output_cfg): Output predecessor edges. + * lto-streamer-in.cc (input_cfg): Input predecessor edges. + +2026-09-21 Josef Melcr + + PR ipa/127104 + * internal-fn.def (ASSUME): Downgrade from const to pure. + +2026-09-21 Kyrylo Tkachov + + * genextract.cc (locstr): Make it a string of bytes. + (UPPER_OFFSET, MISSING_OPERAND_CHAR): Remove. + (ENCODE_PATH_STEP, MISSING_OPERAND_STEP, MAX_PATH_INDEX): New macros. + (accum_extract::pathstr): Hold bytes. + (push_pathstr_operand): Encode the step as a number and check that + the index fits. + (VEC_safe_set_locstr, VEC_char_to_string, add_path, gen_insn): Update + for the byte paths. + (print_string_literal): Remove. + (print_extractions): Emit the paths as an array of numbers and walk + them without the character ranges. + +2026-09-21 Christophe Lyon + + * configure.ac: Replace 'ret' with '$insn'. + * configure: Regenerate. + +2026-09-21 Uros Bizjak + + PR target/127461 + * config/i386/mmx.md (negv2qi2): Use optimize_size instead of + optimize_function_for_size_p (cfun) in the enabled attribute. + (v2qi3): Ditto. + +2026-09-21 Artemiy Volkov + + * match.pd: New rule to fold ((X >> C1) & C2) << C3. + +2026-09-21 Jakub Jelinek + + PR target/127498 + * config/i386/sse.md (3 any_rotate:VI1_AVX512_3264): Add + TARGET_AVX2 to condition. + +2026-09-21 Kyrylo Tkachov + + PR rtl-optimization/127445 + * function.cc (gen_call_used_regs_seq): Return whether a zeroing + sequence was emitted. Do not update the exit block uses here. + (pass_zero_call_used_regs::execute): Call + df_update_entry_exit_and_calls once when a sequence was emitted. + +2026-09-21 Naveen + + PR tree-optimization/98984 + * match.pd: Fold integer-float-integer conversions when the + intermediate floating-point significand covers the final integer + precision under -fno-trapping-math. + +2026-09-20 Matt Turner + + * config/alpha/alpha.cc (alpha_expand_movmisalign): Derive the + access size from MODE rather than assuming 8 bytes. + * config/alpha/alpha.md (MISALIGN): New mode iterator. + (movmisalign): Use it in place of VEC. + +2026-09-20 Samarth Tandale + + PR tree-optimization/125700 + * match.pd: Fold type-bound guarded min/max expressions. + +2026-09-20 Iain Sandoe + + * common/config/i386/cpuinfo.h (darwin_get_kernel_bool): New. + (get_available_features): Query kernel for avx512 availability + on Darwin. + +2026-09-20 Yongqiang Tian + + PR rtl-optimization/127423 + * ifcvt.cc (noce_get_alt_condition): Ignore debug instructions when + checking whether if_info->x is mentioned in the interval. + +2026-09-20 Konstantinos Eleftheriou + + * tree-ssa-math-opts.cc (build_long_mul_partial_operand): New + function. + (build_long_mul_partials): Use it. + +2026-09-20 Philipp Tomsich + Konstantinos Eleftheriou + + PR tree-optimization/127042 + * tree-ssa-math-opts.cc (build_long_mul_partials): Emit zero + high-half partial products, and skip the high-half split and + the low-half mask, for an operand that provably fits the half + width. + +2026-09-20 Dominic P + + * gimple-fold.h (gimple_needing_rewrite_undefined): Add a + SHIFT_COUNT parameter defaulting to false. + * gimple-fold.cc (gimple_needing_rewrite_undefined): Return true + for a shift or rotate whose count may be out of range, only when + SHIFT_COUNT. + (rewrite_to_defined_unconditional): Reduce such a count into range. + * tree-ssa-loop-im.cc (shift_needs_mask_p): New function. + (determine_max_movement): Cost a shift whose count would need + masking as cheap. + (movement_possibility_1): Require preserved execution for a + possibly out-of-range count only when the rewrite cannot reduce it + or the loop is optimized for size. + +2026-09-20 Filip Kastl + + * tree-switch-conversion.cc (bit_test_cluster::find_bit_tests): + State that the bit test algorithm is optimal. + +2026-09-20 Andrea Pinski + + * match.pd (`((VCE (a cmp b ? -1 : 0)) < 0) ? c : d`): Remove + `(a cmp b)` match part. + +2026-09-20 Andrea Pinski + + * match.pd (`CMP * a`): Use tcc_comparison directly. + (`(type)CMP * a`): Likewise. + +2026-09-20 Andrea Pinski + + * match.pd (maybe_cmp): Use tcc_comparison directly instead + of for loop. + +2026-09-20 Konstantinos Eleftheriou + + PR rtl-optimization/126412 + * fold-mem-offsets.cc (change_in_vec_p): Move before fold_groups. + (changes_map_t): New type. + (class fold_groups): New class. + (struct regno_changes): Remove. + (sort_pairs): Likewise. + (cancel_changes_for_group): Take the fold group to cancel. + (find_groups_to_cancel): Rename from find_keys_to_remove. + (update_insns): Group the changes by fold group instead of by the + register defined by the last fold insn of the def-chain. + (fold_mem_offsets_1): Use fold_groups and commit all groups in a + single change_insns call. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (unsigned_integer_narrow_clip): Add the complement + form. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (signed_integer_sat_trunc): Add the constant-clamp + form. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (integer_constant_clamp): New match. + (unsigned_integer_narrow_clip): Add the constant-clamp form. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (signed_integer_sat_val): Recognize an arithmetic + sign shift. + (signed_integer_sat_trunc): Use signed_integer_sat_val in the existing + form. Recognize a shifted value with an equivalent pre-shift sign + source. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (unsigned_integer_sat_add): Accept a compare + against MAX - 1 in the widened form. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (signed_integer_sat_add): Add the two sided + clamp on a wider intermediate, in both nesting orders. + (signed_integer_sat_sub): Likewise. + * tree-ssa-math-opts.cc (match_unsigned_saturation_sub): Rename + to ... + (match_saturation_sub_with_assign): ... this, and ask the signed + predicate as well. + (math_opts_dom_walker::after_dom_children): Update the callers, + and call it for NOP_EXPR. + +2026-09-20 Kyrylo Tkachov + + * match-sat-alu.pd (signed_integer_sat_trunc): Allow a wider lossless + unsigned range type. Continue to require a narrowing result. Construct + the expected constants at the range precision. + +2026-09-20 Stefan Schulze Frielinghaus + + PR middle-end/127474 + * expmed.cc (expand_mult): Look through vector mode. + +2026-09-19 Jørgen Kvalsvik + + * gcov.cc (add_path_counts): Read the right field paths.size. + (function_summary): Add missing else. + +2026-09-19 Andrea Pinski + + PR tree-optimization/127053 + * tree-ssa-phiopt.cc (trailing_store_in_bb): Rename vphi to + vuse_only. + (cond_if_else_store_replacement_limited): Add case if + cond_if_else_store_replacement_1 failed, allowing + for skipping one store on each side. + (trailing_store_in_bb): Require the store stmt + to be a gimple simple assign. + +2026-09-19 Yongqiang Tian + + PR target/127460 + * config/pru/pru.cc (pru_insert_loop_label_last): Ignore debug + instructions while counting final loop opcodes. + +2026-09-19 panciyan + + * function.cc (assign_parm_find_stack_rtl): When data->partial is + nonzero, limit the stack slot alignment to the largest power of + two dividing the partial size. + +2026-09-19 Milan Tripkovic + + PR target/127374 + * config/riscv/iterators.md (leu): Map gt to le + * config/riscv/zicond.md: Add define_split patterns + +2026-09-19 Dominic P + + * postreload.cc (reload_cse_regs_1): Find the condition of the + predecessor's conditional branch with get_condition, so a comparison + held in the condition-code register is seen. Reject a jump whose + target is not a label. Record the implicit set only where the block + sets the register to that value. + +2026-09-19 Milan Tripkovic + + PR target/126074 + * config/riscv/riscv.cc (riscv_build_integer_1): Add logic to + synthesize constants using shNadd.uw. + (riscv_move_integer): Handle FMA with use_uw for RTL emission. + +2026-09-18 Andrea Pinski + + PR tree-optimization/125945 + * tree-ssa-phiopt.cc (induction_based): New function. + (factor_out_conditional_load): Allow some factoring out + with early and/or before_vect. + (factor_out_all): Set before_vect to false when not vectorizing. + (pass_phiopt::execute): Initialize scev in some cases. + +2026-09-18 Michiel Derhaeg + + * config/riscv/riscv.cc (synthesize_add): Do not form shNadd + when the base register is a virtual register. + +2026-09-18 Zhongyao Chen + + PR rtl-optimization/127367 + * ext-dce.cc: Include regs.h. + (ext_dce_process_uses): Handle multi-register hard regs. + +2026-09-18 Bohan Lei + + * config/riscv/riscv-vector-costs.cc (costs::better_main_loop_than_p): + Compare VLA costs under -mrvv-max-lmul=dynamic. + +2026-09-18 Richard Ball + + * config/aarch64/aarch64-builtins.cc + (enum aarch64_builtins): Add new builtins. + (aarch64_init_atomic_hints_builtins): Likewise. + (aarch64_expand_atomic_hints_builtins_fetch): Handle Fetch intrinsics. + (aarch64_general_expand_builtin): Add call for new builtins. + (aarch64_resolve_overloaded_builtin_atomic_hint_fetch): Handle Fetch intrinsics. + (aarch64_resolve_overloaded_builtin_general): Add new call. + * config/aarch64/arm_acle.h + (enum atomic_fetch): Store different Fetch types. + (__arm_atomic_fetch_add_with_hint): Add new builtin. + (__arm_atomic_fetch_sub_with_hint): Likewise. + (__arm_atomic_fetch_and_with_hint): Likewise. + (__arm_atomic_fetch_xor_with_hint): Likewise. + (__arm_atomic_fetch_or_with_hint): Likewise. + * config/aarch64/atomics.md + (aarch64_atomic_fetch__atomic_hint): New pattern for atomic_fetch. + (@aarch64_atomic_hints_fetch): Likewise. + * config/aarch64/iterators.md: New unspecs. + +2026-09-18 Richard Ball + + * config/aarch64/aarch64-builtins.cc + (enum aarch64_builtins): Change Function/Builtin names. + (aarch64_init_pcdphint_builtins): Likewise. + (aarch64_init_atomic_hints_builtins): Likewise. + (aarch64_general_init_builtins): Likewise. + (aarch64_expand_stshh_builtin): Likewise. + (aarch64_expand_atomic_hints_builtins): Likewise. + (aarch64_general_expand_builtin): Likewise. + (aarch64_resolve_overloaded_builtin_stshh): Likewise. + (aarch64_resolve_overloaded_builtin_atomic_hint_store): Likewise + (aarch64_resolve_overloaded_builtin_general): Likewise. + * config/aarch64/arm_acle.h + (__atomic_store_with_stshh): Likewise. + (__arm_atomic_store_with_hint): Likewise. + * config/aarch64/atomics.md + (@aarch64_atomic_store_stshh): Add new hints to pattern + (@aarch64_atomic_hints_store): Likewise. + * config/aarch64/iterators.md: Add Unspec for new hints. + +2026-09-18 Richard Biener + + * tree-vect-slp.cc (vect_build_slp_tree): Assert successful + discovered nodes do not require splitting. + +2026-09-18 Richard Biener + + PR tree-optimization/127473 + * tree-vect-slp.cc (vect_build_slp_tree_3): Duplicate the BB + case of rejecting a not grouped load early to avoid assiging + the first_match to it. + +2026-09-18 Andrew Stubbs + + * config/gcn/gcn-valu.md (mov_exec): Add xnack alternatives. + (@mov_sgprbase): Likewise. + +2026-09-18 Richard Biener + + PR tree-optimization/127468 + * tree-vect-slp.cc (vect_build_slp_tree_3): Print the correct + trapping stmt. + +2026-09-18 Léo Hardt + + * asan.cc: Remove include that already came from ssa.h. + * gimple-ssa-pta-constraints.cc: Remove unused include. + * tree-ssa-loop-unswitch.cc: Likewise. + * ubsan.cc: Change an include to a more specific file. + * value-query.cc: Remove unused import. + * value-range-storage.cc: Likewise. + * value-range.cc: Change an include to a more specific file. + +2026-09-18 Kael Andrew Alonzo Franco + + PR tree-optimization/127406 + * match.pd: Restrict (X {+,-} M*N) / N optimization. + +2026-09-18 Alfie Richards + + * machmode.h (parse_machine_mode): New function. + * read-rtl.cc (find_mode): Use parse_machine_mode. + * config/riscv/riscv-v.cc (autovectorize_vector_modes): Likewise. + +2026-09-18 Jakub Jelinek + Manjunath Matti + + PR middle-end/127378 + * gimple-lower-bitint.cc (bitint_large_huge::lower_mergeable_stmt): On + big endian, compare idx_next in separate_ext loop against + bo_idx + total - 1 - end, and if that wraps around, compare idx + against 0 instead. + +2026-09-18 Richard Biener + + PR tree-optimization/126306 + * tree-vect-slp.cc (vect_build_slp_tree_1): Remove soft-failing. + (vect_build_slp_tree_2): Add soft-failing here, delayed + to after vect_get_and_check_slp_defs. + (vect_get_and_check_slp_defs): When we'll soft-fail do not + fall back to vect_external_def on mismatches. + +2026-09-18 Pan Li + + * config/riscv/constraints.md (Wn3): New constraint for the + vector register which doesn't overlap the register group of + the operand 3. + * config/riscv/riscv-protos.h (riscv_v_widen_non_overlap_constraint_ok): + New function declaration. + * config/riscv/riscv-v.cc (riscv_v_reg_group_overlap_p): New + function to tell if two vector register groups overlap. + (riscv_v_widen_constraint_ok): Leverage the above function for + the register group overlap check. + (riscv_v_widen_non_overlap_constraint_ok): New function to tell + if the register doesn't overlap the reference register group. + * config/riscv/vector.md: Take the Wn3 constraint for the + operand 4 of the widening integer reduction. + +2026-09-18 Yongqiang Tian + + PR rtl-optimization/127421 + * reorg.cc (redundant_insn): Use NONDEBUG_INSN_P in both bounded + backward walks. Remove redundant debug-instruction checks. + +2026-09-18 Yongqiang Tian + + PR rtl-optimization/127422 + * combine.cc (can_combine_p): Ignore debug instructions when scanning + for intervening volatile references. + +2026-09-18 Xi Ruoyao + + * config/loongarch/loongarch.md (bitreverseqi2): Disable on + LA32R. + +2026-09-17 Andrew MacLeod + + * value-relation.cc (dom_oracle::query): Prefer a normal + relation over a partial equivalency. + (path_oracle::record): Do not record partial equivalences, nor + intersect one with the relation being recorded. + +2026-09-17 Andrew MacLeod + + * value-relation.cc (dom_oracle::record): Do not record + VREL_UNDEFINED. + (dom_oracle::search_and_merge_relation): Likewise. + (path_oracle::record): Likewise. + +2026-09-17 Andrew MacLeod + + * value-relation.cc (rr_negate_table): Fill PE slots. + (rr_swap_table): Likewise. + (rr_intersect_table): Likewise. + (rr_union_table): Likewise. + (rr_transitive_table): Likewise. + (relation_tests): Also confirm partial equivalency entries. + +2026-09-17 Richard Biener + + PR tree-optimization/127405 + * tree-ssa-loop-manip.cc (tree_transform_and_unroll_loop): Only + set nb_iterations_upper_bound of the epilogue loop and scale its + profile when the control IV is known not to wrap. + +2026-09-17 Richard Biener + + * tree-vect-slp.cc (vect_build_slp_instance): Pick the + largest isomorphic subset when vectorizing a BB reduction. + +2026-09-17 Richard Biener + + * tree-vectorizer.h (match_elt_t): New. + (_slp_tree::failed): Make a match_elt_t *. + * tree-vect-slp.cc (vect_build_slp_tree_3): Make + re-startable at start_i, change representation of + matches[] to match_elt_t[]. + (vect_build_slp_tree_1): Iteratively resolve not matched lanes. + Retain isomorphism of BB unrolling failed tail. + (vect_build_slp_tree_2): Adjust for s/bool/match_elt_t/ + (vect_build_slp_tree): Likewise. + (optimize_load_redistribution_1): Likewise. + (vect_build_slp_instance): Likewise. + (vect_analyze_slp_reduc_chain): Likewise. + (vect_analyze_slp_reduction): Likewise. + (vect_analyze_slp_reduction_group): Likewise. + (vect_analyze_slp_reductions): Likewise. + (vect_analyze_slp_instance): Likewise. + (vect_lower_load_permutations): Likewise. + +2026-09-17 Richard Biener + + PR tree-optimization/127407 + * tree-vect-data-refs.cc (vect_analyze_data_ref_dependence): + Also call vect_preserves_scalar_order_p for negative dependence + distance. + +2026-09-17 Uros Bizjak + + * config.gcc (i[34567]86-*-* | x86_64-*-*): Set + default_md_generator_partitions target default to 6:6:1. + +2026-09-17 Andrew Stubbs + + * config/gcn/gcn.cc (gcn_spill_class): Spill scalars in VGPRs to + SCALAR_SPILL_REGS. + (gcn_memory_move_cost): Handle SCALAR_SPILL_REGS. + * config/gcn/gcn.h (enum reg_class): Add SCALAR_SPILL_REGS. + (REG_CLASS_NAMES): Likewise. + (REG_CLASS_CONTENTS): Likewise. + +2026-09-17 Michiel Derhaeg + + PR target/127191 + * config/arc/arc.md (doloop_end): Clobber CC. + (loop_end): Likewise. + (dbnz): Likewise. + (flag): Likewise. + (kflag): Likewise. + +2026-09-17 Michiel Derhaeg + + * config/arc/arc.cc (arc_init_reg_tables): Set the mode class of + CC_Vmode to C_MODE. + +2026-09-17 Michiel Derhaeg + + PR target/126243 + * config/arc/simdext.md (v2si3): Require TARGET_PLUS_QMACW. + +2026-09-17 Claudiu Zissulescu + + * config/arc/arc.md: Remove the "cond" attribute definition, all + its uses and the comments describing it. + * config/arc/fpu.md: Likewise. + * config/arc/fpx.md: Likewise. + * config/arc/simdext.md: Likewise. + +2026-09-17 Longjun Luo + + PR lto/126841 + * doc/invoke.texi (-ffunction-sections): Document implicit function + section names under LTO. + * ipa-strub.cc (pass_ipa_strub::execute): Let cfgexpand resolve the + GIMPLE wrapper section. + * symtab-thunks.cc (expand_thunk): Likewise for generic GIMPLE thunks. + Clarify the direct-assembler case. + +2026-09-17 Andrea Pinski + + PR tree-optimization/127103 + * match.pd (`minmax (a - c, b) + c`): New pattern. + +2026-09-17 Andrea Pinski + + PR tree-optimization/127103 + * match.pd (`x+umax(x,1)`): New pattern. + +2026-09-17 Gaius Mulley + + PR modula2/126174 + * doc/gm2.texi (Using GNU Modula-2): Move Unbounded by reference after + Exception handling in the menu. + +2026-09-16 Kyrylo Tkachov + + * lto-wrapper.cc (run_gcc): Make saved parallel LTRANS outputs phony. + +2026-09-16 Senthil Kumar Selvaraj + + * ipa-inline.cc (report_inline_failed_reason): Check for NULL + before calling cl_target_option_print_diff. + +2026-09-16 Léo Hardt + + * asan.cc: Remove duplicate stringpool includes. + * builtins.cc: Likewise. + * calls.cc: Likewise. + * cgraphunit.cc: Likewise. + * dwarf2out.cc: Likewise. + * fold-const.cc: Likewise. + * function.cc: Likewise. + * gimple-expr.cc: Likewise. + * internal-fn.cc: Likewise. + * ipa.cc: Likewise. + * lto-cgraph.cc: Likewise. + * pointer-query.cc: Likewise. + * tree-streamer-in.cc: Likewise. + * varasm.cc: Likewise. + +2026-09-16 Richard Biener + + * tree-vect-stmts.cc (vectorizable_conversion): Prevent + conversions from non-mode-precision _BitInt. + +2026-09-16 Tamar Christina + + * config/aarch64/aarch64-sve-builtins-sme.def (DEF_SME_FUNCTION_GS): Undef + at end. + +2026-09-16 Stefan Schulze Frielinghaus + + * ira-lives.cc (single_reg_class): Compute regno in case of + single reg class constraint or hard register constraint, and + rename to ... + (single_reg_class_regno): ... this. + (single_reg_operand_class): Similarly as before and rename + to ... + (single_reg_operand_class_regno): ... this. + (process_single_reg_class_operands): Utilize + single_reg_operand_class_regno() and deal with regnos directly + instead of single reg classes. + (process_single_reg_class_operands): Rename to ... + (process_single_reg_constrained_operands): ... this. + (process_bb_node_lives): Refer to renamed function. + +2026-09-15 Gerald Pfeifer + + * doc/libgdiagnostics/topics/sarif.rst: Update SARIF website URL. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa.cc (xtensa_valid_move): + Remove code that rejects non-register sources when the destination + is the stack pointer. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa.h + (GP_REG_NUM, BR_REG_NUM, FP_REG_NUM, ACC_REG_NUM): Remove. + (GP_REG_P, BR_REG_P, FP_REG_P, ACC_REG_P): + Change to use the IN_RANGE() macro. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa-protos.h (xt_true_regnum): Remove. + * config/xtensa/xtensa.cc (xt_true_regnum): + Specify as a static function. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa-protos.h (xtensa_regno_to_class): + Remove. + * config/xtensa/xtensa.h (xtensa_regno_to_class): + Declaration of a new global array. + (REGNO_REG_CLASS): + Change to reference the xtensa_regno_to_class array. + * config/xtensa/xtensa.cc (xtensa_regno_to_class): + Remove the original function definition and define it as a new global + array. + (xtensa_conditional_register_usage): + Append code to the end that records a map in xtensa_regno_to_class + showing which of the current regclass definitions each hardware + register belongs to. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa.cc (xtensa_adjust_reg_alloc_order): + Reformat the "reg_call0_alloc_order" array. + * config/xtensa/xtensa.h (REG_ALLOC_ORDER): Reformat. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa.cc (xtensa_conditional_register_usage): + Clear the bit corresponding to the A0 register from the + HARD_REG_SET associated with RL_REGS, if TARGET_WINDOWED_ABI + is enabled. + +2026-09-15 Takayuki 'January June' Suwa + + * config/xtensa/xtensa.h (EPILOGUE_USES): Remove. + * config/xtensa/xtensa.md (return): + Resurrect '(use (reg:SI A0_REG))' to the template description. + (sibcall_epilogue): Revive emitting '(use (reg:SI A0_REG))'. + +2026-09-15 Jørgen Kvalsvik + + PR gcov-profile/127408 + * gcov.cc (function_summary): Check calls_suppressed, not calls. + +2026-09-15 Richard Biener + + PR tree-optimization/127390 + * tree-vect-stmts.cc (vectorizable_comparison_1): Reject + bit-precision integer comparisons. + +2026-09-15 Kyrylo Tkachov + + * Makefile.in (NUM_INSNRECOG_SPLITS): New variable. + (INSNRECOG_SPLITS_SEQ): Use it. + (NUM_INSNATTRTAB_SPLITS): New variable. + (INSNATTRTAB_SPLITS_SEQ): Use it. + (MOSTLYCLEANFILES): Remove all numbered generator sources. + (s-tmp-emit, s-tmp-recog): Stop when an output move fails. + (s-tmp-emit, s-tmp-recog, s-attrtab): Depend on Makefile. + * config.gcc (default_md_generator_partitions): New variable. + Document its scalar and tuple forms. + (aarch64*-*-*): Set the target default. + * configure.ac (--with-md-generator-partitions): New option. + (--with-insnemit-partitions): Keep as a deprecated alias. + Use the target default when no option is specified. Validate and + substitute all three counts. + * configure: Regenerate. + * doc/install.texi (--with-md-generator-partitions): Document. + +2026-09-15 Kyrylo Tkachov + + * Makefile.in (INSNATTRTAB_SPLITS_SEQ, INSNATTRTAB_SEQ_SRC) + (INSNATTRTAB_SEQ_TMP, INSNATTRTAB_SEQ_O): New variables. + (OBJS): Replace insn-attrtab.o with $(INSNATTRTAB_SEQ_O). + (MOSTLYCLEANFILES): Add $(INSNATTRTAB_SEQ_SRC), retaining the legacy + unnumbered source for cleanup. + (.PRECIOUS): Use $(INSNATTRTAB_SEQ_SRC). + (s-attrtab): Generate and move numbered attribute files. Stop when a + move fails. + * configure.ac (--with-insnemit-partitions): Document all generators + which use the option. + * configure: Regenerate. + * genattrtab.cc (attr_file_name, attr_file, open_outfile): Remove. + (output_files): New variable. + (dfa_file_name, latency_file_name): Retain output names. + (make_automaton_attrs): Write to the first attribute partition. + (handle_arg): Register repeatable attribute outputs. + (attr_output_size, cmp_attr_output_size): New functions. + (main): Register fixed outputs and use the common output helpers. + Distribute attribute, delay, and length functions, largest first. + * final.cc (length_unit_log): Update comment for partitioned output. + * config/arc/arc-protos.h (regno_clobbered_p): Likewise. + * config/ia64/ia64.cc (bundling): Likewise. + * config/ia64/t-ia64 (insn-attrtab.o-warn): Replace with per-partition + warning variables. + * config/sh/sh.h (code_for_indirect_jump_scratch): Update comment for + partitioned output. + +2026-09-15 Kyrylo Tkachov + + * gensupport.h (generator_output): New structure. + (add_generator_output, open_generator_outputs): Declare. + (close_generator_outputs): Likewise. + (choose_output): Accept generator_output records. Remove the output + index parameter. + * gensupport.cc (add_generator_output): New function. + (open_generator_outputs, close_generator_outputs): Likewise. + (choose_output): Select only partition records. Remove the output index + and disabled round-robin implementation. + (SIZED_BASED_CHUNKS): Remove. + * genemit.cc (output_files): Use generator_output records. + (handle_arg): Register output names. + (main): Use the common open, selection, and close helpers. + * genrecog.cc (print_subroutine_group): Accept generator_output records. + (header_name): Change to a pointer. + (header): Remove global variable. + (output_files): Use generator_output records. + (handle_arg): Register output names and validate -H. + (main): Validate and register the header output. Use the common open, + selection, and close helpers. Remove an unused output selection. + +2026-09-15 Kyrylo Tkachov + + * genattrtab.cc (attr_value): Add enum_index. + (attr_desc): Add num_values, derived_from and derived_table. + (get_attr_value, add_attr_value, find_attr): Maintain them. + (attr_value_index, eq_attr_value_set, simple_enum_attr_p) + (sole_tested_attr, find_derived_attrs, write_derived_attr_get): New + functions. + (write_attr_get): Use write_derived_attr_get where it applies. + (main): Call find_derived_attrs before optimize_attrs. + +2026-09-15 Richard Biener + + PR tree-optimization/126760 + PR tree-optimization/127391 + * tree-if-conv.cc (if_convertible_stmt_p): Delay switch + validation to ... + (if_convertible_loop_p_1): ... the loop iterating over + PHIs. + +2026-09-15 Jakub Jelinek + + PR target/127352 + * config/i386/i386-expand.cc (split_double_mode): For high halves of + paradoxical subregs after RA use CONST0_RTX (half_mode) instead of + ICE. + +2026-09-15 Richard Biener + + PR tree-optimization/113703 + * tree-ssa-loop-ivopts.cc: Include gimple-range.h. + (nonneg_scaled_offset_p): New function. + (iv_elimination_compare_lt): Add USE and BOUND_P parameters. Bail + out if the exit test does not come after the increment of the + candidate, if the comparison in the number of iterations is signed + or if the offsets are not known to be non-negative and to not + overflow. Recompute the bound and store it in BOUND_P. + (may_eliminate_iv): Adjust the call to iv_elimination_compare_lt + and move the expensiveness check on the bound after it. + +2026-09-15 Tamar Christina + + PR target/126629 + * config/aarch64/aarch64-sve-builtins-base.cc + (emit_ldf1_ffr_update): New. + (svldff1_gather_impl, svldff1_gather_extend, svldxf1_impl, + svldxf1_extend_impl): Use it. + * config/aarch64/aarch64-sve.md (aarch64_update_ffr): Update insn. + +2026-09-15 Haochen Jiang + + PR target/127264 + * config/i386/i386-expand.cc (ix86_expand_ace_builtin): + Revise logic to avoid INTVAL check for non-constant + operands. + +2026-09-15 Kyrylo Tkachov + + PR middle-end/127185 + * builtins.cc (expand_builtin_strub_update): Use a separate MEM with + load trap semantics for each watermark load. + (expand_builtin_strub_leave): Use load trap semantics for watermark + MEMs. + +2026-09-15 Kyrylo Tkachov + + PR middle-end/127185 + * cfgexpand.cc (expand_asm_stmt): Restore load MEM_NOTRAP for memory + inputs. + * internal-fn.cc: Include tree-eh.h. + (expand_partial_load_optab_fn): Expand the source as memory and + restore load MEM_NOTRAP. + +2026-09-15 Kyrylo Tkachov + + PR middle-end/127185 + * builtins.cc (get_memory_rtx): Add STORE_P. Pass it to + set_mem_attributes. + (expand_builtin_memory_copy_args): Mark the destination as a store + and the source as a load. + (expand_movstr): Likewise. + (expand_builtin_strncpy): Mark the destination as a store. + (expand_builtin_memset_args): Likewise. + (expand_builtin_memcmp): Mark both memory operands as loads. + (expand_builtin_strcmp): Likewise. + (expand_builtin_strncmp): Likewise. + (inline_string_cmp): Mark the memory operand as a load. + * builtins.h (get_memory_rtx): Add STORE_P. + * internal-fn.cc (expand_RAWMEMCHR): Mark the memory operand as a + load. + +2026-09-15 Kyrylo Tkachov + + PR middle-end/127185 + * emit-rtl.cc (set_mem_attributes_minus_bitpos): Add MAY_STORE_P. + Use lhs_could_trap_p when it is true. + (set_mem_attributes): Add MAY_STORE_P and pass it through. + * emit-rtl.h (set_mem_attributes): Add MAY_STORE_P with a + conservative default. + (set_mem_attributes_minus_bitpos): Likewise. + * expr.cc (expand_assignment): Mark the destination as a store. + (expand_expr_real_1): Treat only EXPAND_NORMAL as a known load. + Set MEM_NOTRAP from the access direction. + +2026-09-15 Kyrylo Tkachov + + PR middle-end/127184 + * gimple.cc (gimple_could_trap_p_1): Check a memory LHS with + lhs_could_trap_p. Do not inspect an LHS as an rvalue. + (test_could_trap): New self-test. + (gimple_cc_tests): Run it. + * tree-eh.cc (stmt_could_throw_p): Check a nothrow call's memory LHS. + +2026-09-15 Naveen + + * config/aarch64/aarch64-simd.md: Add define_expand sadv8qi + guarded by TARGET_DOTPROD. + +2026-09-15 Hongyu Wang + + PR target/127177 + * config/i386/i386-expand.cc (ix86_fp_cmp_code_to_pcmp_immediate): + Return the _UQ predicate immediates for UNLE, UNLT, UNGE, UNGT and + UNEQ. + * config/i386/i386.cc (ix86_print_operand):Likewise to print the + _uq suffixed AVX predicates for these codes. + * config/i386/predicates.md (ix86_fp_vec_cmp_operator): New + predicate. + * config/i386/sse.md (vec_cmp): Use the + new predicate for the VF_128 compare. + * config/i386/mmx.md (vec_cmpv2sfv2si): Likewise. + +2026-09-14 Jean-Didier Pailleux + + * config/aarch64/aarch64-sve-builtins-sme.def (REQUIRED_EXTENSIONS): Add + missing #undef. + +2026-09-14 Dominic P + + PR tree-optimization/127379 + * match.pd (ior_range_test_0): Require an integral type. + +2026-09-14 Wilco Dijkstra + + * config/aarch64/aarch64.h (TARGET_SVE_PREFER_ZEROING_MOVIMM): New + define. + * config/aarch64/aarch64-sve.md (*vcond_mask_): Add a + split condition for zero predicate. + * config/aarch64/aarch64-tuning-flags.def: Add AVOID_MOVIMM_Z tune. + * config/aarch64/tuning_models/neoversev1.h (tune_flags): Update. + * config/aarch64/tuning_models/neoversev2.h (tune_flags): Update. + +2026-09-14 xiezhiheng + + * haifa-sched.cc (max_issue): Cap max_lookahead_tries + +2026-09-14 Jakub Jelinek + + PR middle-end/127336 + * optabs.cc (maybe_emit_compare_and_swap_exchange_loop, + expand_atomic_fetch_op_no_fallback, expand_atomic_fetch_op): Force + val into a pseduo if it updates to mem could change its value + and when using val after the atomic op or inside of a loop. + +2026-09-14 Kyrylo Tkachov + + * genemit.cc (main): Choose an output file for each overloaded name. + +2026-09-14 Kyrylo Tkachov + + * rtl.h (note_split): Declare. + * emit-rtl.cc (note_split): New function. + * genemit.cc (gen_split): Call it rather than emitting the test and + the fprintf. + +2026-09-14 Kyrylo Tkachov + + * genrecog.cc (md_conditions, md_condition_ids): New variables. + (md_condition_id, print_md_conditions): New functions. + (print_test): Call a helper for a C test rather than emitting the + condition. + (main): Write the helpers to the header. + +2026-09-14 Kyrylo Tkachov + + * genextract.cc (MISSING_OPERAND_CHAR): New macro. + (pathpool, dupnums): New variables. + (add_path, print_string_literal, print_extractions): New functions. + (print_path): Remove. + (print_header): Only emit the prologue. + (main): Call print_extractions. + +2026-09-14 Kyrylo Tkachov + + * match-sat-alu.pd (unsigned_integer_sat_sub): Accept commuted + comparison operand orders and the arm order from a two-return source. + +2026-09-14 Kyrylo Tkachov + + * match-sat-alu.pd (unsigned_integer_sat_sub): Add the + X - MIN (X, Y) form. + * tree-ssa-math-opts.cc + (build_saturation_binary_arith_call_and_replace): Return whether a + replacement was made. + (match_saturation_add_with_assign): Likewise. + (match_unsigned_saturation_sub): Likewise. + (math_opts_dom_walker::after_dom_children): Check MINUS_EXPR for + saturation, and use the assign recognizer results. + +2026-09-14 Claudio Bantaloukas + + * config/aarch64/aarch64-acle-builtins.cc: + (function_resolver::resolve_to): Fix documentation comment. + * config/aarch64/aarch64-acle-builtins.h: (TYPES_tmop_base, + TYPES_tmop_h_bfloat, TYPES_tmop_h_float, TYPES_tmop_h_mf8, + TYPES_tmop_s_mf8): Add new DEF_SVE_TYPES_ARRAYs. + * config/aarch64/aarch64-c.cc: (__ARM_FEATURE_SME_TMOP): Add define. + * config/aarch64/aarch64-sme.md: + (@aarch64_sme_lane_): Add + new insn. + (@aarch64_sme_lane_): + Likewise. + (@aarch64_sme_lane_): + Likewise. + (@aarch64_sme_lane_): + Likewise. + (@aarch64_sme_lane_): + Likewise. + * config/aarch64/aarch64-sve-builtins-shapes.cc: + (ternary_za_uint_dual_single): Add new shape. + * config/aarch64/aarch64-sve-builtins-shapes.h: Likewise. + * config/aarch64/aarch64-sve-builtins-sme.cc: (svtmopa_lane_za_impl): + Add new function impl class. + (svtmopa_lane_za): Add new FUNCTION. + * config/aarch64/aarch64-sve-builtins-sme.def: (svtmopa_lane): Add new + DEF_SME_ZA_FUNCTION_GS entries. + * config/aarch64/aarch64-sve-builtins-sme.h: (svtmopa_lane_za): Add new. + * config/aarch64/aarch64.h: (TARGET_STREAMING_SME_TMOP): Add new define. + * config/aarch64/constraints.md (Uwo): Add new constraint for Control + Vector Register in TMOP operations. + * config/aarch64/iterators.md: (SME_TMOPA_BHSF, SME_TMOPA_FP8): Add new mode + iterators. + (UNSPEC_SME_FTMOPA, UNSPEC_SME_FTMOPA_FP8, UNSPEC_SME_STMOPA, + UNSPEC_SME_SUTMOPA, UNSPEC_SME_USTMOPA, UNSPEC_SME_UTMOPA): Add new + unspecs. + (SME_TMOP_INT, SME_TMOP_INT_CROSS, SME_TMOP_FP, SME_TMOP_FP8): Add new + iterators. + (za_imm_bits): Add new mode_attr. + (optab): Update with new unspecs. + * config/aarch64/predicates.md: (aarch64_imm1, aarch64_imm4): Add new + predicates. + +2026-09-14 Claudio Bantaloukas + + * config/aarch64/aarch64.md: Rename aarch64_imm3 as aarch64_shift_imm3. + * config/aarch64/aarch64-simd.md: Rename aarch64_lane_imm3 as aarch64_imm3. + * config/aarch64/predicates.md: Rename aarch64_imm3 as aarch64_shift_imm3 + and aarch64_lane_imm3 to aarch64_imm3. + +2026-09-14 Richard Biener + + PR tree-optimization/127377 + * tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): + Properly consider the padding before the object when + pruning the size. + +2026-09-14 Richard Biener + + PR tree-optimization/127363 + * tree-vect-stmts.cc (vectorizable_assignment): Properly + code-generate PAREN_EXPRs. + +2026-09-14 Artemiy Volkov + + PR target/126983 + * config/aarch64/aarch64-simd.md (*aarch64_combinez): + Split into VS32_I_SUB64_F_CONDFP16 and HFBF variants. Change + uxtw to uxt. + (*aarch64_combinez_be): Likewise. + * config/aarch64/iterators.md (VSSUB64_F): Remove iterator. + (VS32_I_SUB64_F): Amend by explicitly listing all modes. + (VS32_I_SUB64_F_CONDFP16): New iterator. + +2026-09-14 Rohith Kapelli + + PR ipa/123227 + * ipa-icf.cc (sem_function::equals_wpa): Compare TYPE_ATTRIBUTES + as a list rather than through comp_type_attributes. Reject a + METHOD_TYPE compared against a FUNCTION_TYPE. + 2026-09-13 Dominic P * generic-match-head.cc (gimple_match_no_overflow_p): New. diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 1c5002a42eae..b17e8c88fd89 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20260914 +20260929 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index c718585e6071..249f7ff81a59 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -235,12 +235,22 @@ INSNEMIT_SEQ_SRC = $(patsubst %, insn-emit-%.cc, $(INSNEMIT_SPLITS_SEQ)) INSNEMIT_SEQ_TMP = $(patsubst %, tmp-emit-%.cc, $(INSNEMIT_SPLITS_SEQ)) INSNEMIT_SEQ_O = $(patsubst %, insn-emit-%.o, $(INSNEMIT_SPLITS_SEQ)) -# Re-use the split number for insn-recog as well. -INSNRECOG_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNEMIT_SPLITS),$(one_to_9999)) +# The number of splits to be made for the insn-recog files. +NUM_INSNRECOG_SPLITS = @DEFAULT_INSNRECOG_PARTITIONS@ +INSNRECOG_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNRECOG_SPLITS),$(one_to_9999)) INSNRECOG_SEQ_SRC = $(patsubst %, insn-recog-%.cc, $(INSNRECOG_SPLITS_SEQ)) INSNRECOG_SEQ_TMP = $(patsubst %, tmp-recog-%.cc, $(INSNRECOG_SPLITS_SEQ)) INSNRECOG_SEQ_O = $(patsubst %, insn-recog-%.o, $(INSNRECOG_SPLITS_SEQ)) +# The number of splits to be made for the insn-attrtab files. +NUM_INSNATTRTAB_SPLITS = @DEFAULT_INSNATTRTAB_PARTITIONS@ +INSNATTRTAB_SPLITS_SEQ = $(wordlist 1,$(NUM_INSNATTRTAB_SPLITS),$(one_to_9999)) +INSNATTRTAB_SEQ_SRC = $(patsubst %, insn-attrtab-%.cc, \ + $(INSNATTRTAB_SPLITS_SEQ)) +INSNATTRTAB_SEQ_TMP = $(patsubst %, tmp-attrtab-%.cc, \ + $(INSNATTRTAB_SPLITS_SEQ)) +INSNATTRTAB_SEQ_O = $(patsubst %, insn-attrtab-%.o, $(INSNATTRTAB_SPLITS_SEQ)) + # These files are to have specific diagnostics suppressed, or are not to # be subject to -Werror: # flex output may yield harmless "no previous prototype" warnings @@ -1405,7 +1415,7 @@ OBJS = \ $(GIMPLE_MATCH_PD_SEQ_O) \ gimple-match-exports.o \ $(GENERIC_MATCH_PD_SEQ_O) \ - insn-attrtab.o \ + $(INSNATTRTAB_SEQ_O) \ insn-automata.o \ insn-dfatab.o \ $(INSNEMIT_SEQ_O) \ @@ -1985,10 +1995,12 @@ TREECHECKING = @TREECHECKING@ FULL_DRIVER_NAME=$(target_noncanonical)-gcc-$(version)$(exeext) MOSTLYCLEANFILES = insn-flags.h insn-config.h insn-codes.h \ - insn-output.cc $(INSNRECOG_SEQ_SRC) insn-recog.h \ - $(INSNEMIT_SEQ_SRC) insn-extract.cc insn-peep.cc \ - insn-attr.h insn-attr-common.h insn-attrtab.cc insn-dfatab.cc \ - insn-latencytab.cc insn-opinit.cc insn-opinit.h insn-preds.cc insn-constants.h \ + insn-output.cc insn-recog-*.cc insn-recog.h \ + insn-emit-*.cc insn-extract.cc insn-peep.cc \ + insn-attr.h insn-attr-common.h insn-attrtab-*.cc insn-attrtab.cc \ + insn-dfatab.cc insn-latencytab.cc insn-opinit.cc \ + insn-opinit.h insn-preds.cc \ + insn-constants.h \ tm-preds.h tm-constrs.h checksum-options $(GIMPLE_MATCH_PD_SEQ_SRC) \ $(GENERIC_MATCH_PD_SEQ_SRC) gimple-match-auto.h generic-match-auto.h \ tree-check.h min-insn-modes.cc insn-modes.cc insn-modes.h insn-modes-inline.h \ @@ -2764,7 +2776,7 @@ $(common_out_object_file): $(common_out_file) .PRECIOUS: insn-config.h insn-flags.h insn-codes.h insn-constants.h \ $(INSNEMIT_SEQ_SRC) insn-recog.h $(INSNRECOG_SEQ_SRC) \ insn-extract.cc insn-output.cc \ - insn-peep.cc insn-attr.h insn-attr-common.h insn-attrtab.cc \ + insn-peep.cc insn-attr.h insn-attr-common.h $(INSNATTRTAB_SEQ_SRC) \ insn-dfatab.cc insn-latencytab.cc insn-preds.cc \ $(GIMPLE_MATCH_PD_SEQ_SRC) $(GENERIC_MATCH_PD_SEQ_SRC) \ gimple-match-auto.h generic-match-auto.h insn-target-def.h @@ -2822,24 +2834,27 @@ $(simple_generated_c:insn-%.cc=s-%): s-%: build/gen%$(build_exeext) # genemit splits its output into different files and doesn't write to # stdout. (but rather to tmp-emit-01.cc..tmp-emit-10.cc) $(INSNEMIT_SEQ_SRC): s-tmp-emit; @true -s-tmp-emit: build/genemit$(build_exeext) $(MD_DEPS) insn-conditions.md +s-tmp-emit: build/genemit$(build_exeext) $(MD_DEPS) insn-conditions.md Makefile $(RUN_GEN) build/genemit$(build_exeext) $(md_file) insn-conditions.md \ $(addprefix -O,${INSNEMIT_SEQ_TMP}) - $(foreach id, $(INSNEMIT_SPLITS_SEQ), \ - $(SHELL) $(srcdir)/../move-if-change tmp-emit-$(id).cc \ - insn-emit-$(id).cc;) + for id in $(INSNEMIT_SPLITS_SEQ); do \ + $(SHELL) $(srcdir)/../move-if-change tmp-emit-$$id.cc \ + insn-emit-$$id.cc || exit 1; \ + done $(STAMP) s-tmp-emit # Same for genrecog. $(INSNRECOG_SEQ_SRC): s-tmp-recog; @true insn-recog.h: s-tmp-recog; @true -s-tmp-recog: build/genrecog$(build_exeext) $(MD_DEPS) insn-conditions.md +s-tmp-recog: build/genrecog$(build_exeext) $(MD_DEPS) \ + insn-conditions.md Makefile $(RUN_GEN) build/genrecog$(build_exeext) $(md_file) insn-conditions.md \ -Hinsn-recog.h \ $(addprefix -O,${INSNRECOG_SEQ_TMP}) - $(foreach id, $(INSNRECOG_SPLITS_SEQ), \ - $(SHELL) $(srcdir)/../move-if-change tmp-recog-$(id).cc \ - insn-recog-$(id).cc;) + for id in $(INSNRECOG_SPLITS_SEQ); do \ + $(SHELL) $(srcdir)/../move-if-change tmp-recog-$$id.cc \ + insn-recog-$$id.cc || exit 1; \ + done $(STAMP) s-tmp-recog # gencheck doesn't read the machine description, and the file produced @@ -2851,13 +2866,19 @@ s-check : build/gencheck$(build_exeext) $(SHELL) $(srcdir)/../move-if-change tmp-check.h tree-check.h $(STAMP) s-check -# genattrtab produces three files: tmp-{attrtab.cc,dfatab.cc,latencytab.cc} -insn-attrtab.cc insn-dfatab.cc insn-latencytab.cc: s-attrtab ; @true +# genattrtab splits the attribute functions like genemit and additionally +# produces tmp-dfatab.cc and tmp-latencytab.cc. +$(INSNATTRTAB_SEQ_SRC): s-attrtab ; @true +insn-dfatab.cc insn-latencytab.cc: s-attrtab ; @true s-attrtab : $(MD_DEPS) build/genattrtab$(build_exeext) \ - insn-conditions.md + insn-conditions.md Makefile $(RUN_GEN) build/genattrtab$(build_exeext) $(md_file) insn-conditions.md \ - -Atmp-attrtab.cc -Dtmp-dfatab.cc -Ltmp-latencytab.cc - $(SHELL) $(srcdir)/../move-if-change tmp-attrtab.cc insn-attrtab.cc + $(addprefix -A,${INSNATTRTAB_SEQ_TMP}) \ + -Dtmp-dfatab.cc -Ltmp-latencytab.cc + for id in $(INSNATTRTAB_SPLITS_SEQ); do \ + $(SHELL) $(srcdir)/../move-if-change tmp-attrtab-$$id.cc \ + insn-attrtab-$$id.cc || exit 1; \ + done $(SHELL) $(srcdir)/../move-if-change tmp-dfatab.cc insn-dfatab.cc $(SHELL) $(srcdir)/../move-if-change tmp-latencytab.cc insn-latencytab.cc $(STAMP) s-attrtab diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index bf5091927d5e..ba0613ff0e72 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,365 @@ +2026-09-23 Eric Botcazou + + * exp_ch7.adb (Establish_Transient_Scope.Find_Transient_Context): + Add commentary about the distinction between compound and simple + statements, and adjust handling for code and delay statements. + +2026-09-23 Eric Botcazou + + * exp_ch6.adb (Function return mechanisms): Minor tweaks. + +2026-09-23 Eric Botcazou + + * sem_res.adb (Set_String_Literal_Subtype): In the nonstatic case, + set String_Literal_Low_Bound first, and check that the actual high + bound is not larger than the high bound of the index type. + +2026-09-23 Eric Botcazou + + * exp_ch6.adb (Create_Extra_Actuals): Pass True for the extra actual + of the Constrained attribute when the actual contains a conversion + to a constrained subtype. + * sem_res.adb (Resolve_Actuals): Skip the resolution of an actual + that is a view conversion in fewer cases. Remove redundant test. + +2026-09-23 Eric Botcazou + + * sem_aggr.adb (Discriminant_Present): Do not return early if the + component list already contains an inherited discriminant. + (Resolve_Record_Aggregate): For an extension, remove the inherited + discriminants from the component list of the rewritten aggregate. + +2026-09-23 Eric Botcazou + + * checks.adb (Apply_Discriminant_Check): Build the actual subtype of + the LHS for a view conversion of a constrained object. + +2026-09-23 Eric Botcazou + + * sem_ch8.adb (Get_Object_Name): Delete. + (Analyze_Object_Renaming): Use Is_Entity_Name to detect names. + * sem_prag.adb (Analyze_Pragma) : Detect ill-formed + quantified expressions and give an error. + : Likewise. + * sem_res.ads (Malformed_Quantified_Expression): New procedure. + * sem_res.adb (Malformed_Quantified_Expression): Likewise. + (Resolve): Call Malformed_Quantified_Expression to give the error + about ill-formed quantified expressions. + +2026-09-23 Eric Botcazou + + * sem_res.adb (Resolve_Membership_Op): Add guard for generic type + to the test on the RM size. + +2026-09-23 Eric Botcazou + + * sem_res.adb (Resolve_Entry): Fix thinko. + +2026-09-23 Eric Botcazou + + * sem_elab.adb (Invocation_Graph.Process_Package_Declaration): Add + cut-off for broken subunits. + +2026-09-23 Eric Botcazou + + * sem_ch3.adb (Build_Derived_Private_Type): In the case where the + partial view has none but the full view has discriminants, do not + set again the Etype, propagate the Has_Constrained_Partial_View + flag from the parent base type and the Is_Constrained flag from + the partial view of the parent type. + (Build_Derived_Record_Type): Propagate Has_Constrained_Partial_View + from the parent base type. + +2026-09-22 Eric Botcazou + + * accessibility.adb (Accessibility_Message): Adjust wording. + (Check_Return_Construct_Accessibility.Accessibility_Error): Ditto. + * sem_attr.adb (Resolve_Attribute) : Likewise for + the specific error message given for subprograms. + * sem_ch3.adb (Analyze_Component_Declaration): Likewise for the + specific error message given for access components. + (Build_Derived_Record_Type): Add references to Ada 95 rules. + * sem_ch6.adb (Analyze_Function_Return): Adjust wording for the + error messages given for class-wide returns. + * sem_ch9.adb (Analyze_Requeue): Likewise for requeue statements. + * sem_ch13.adb (Analyze_Attribute_Definition_Clause) : + Add reference to Ada 2012 accessibility rule. + * sem_res.adb (Resolve_Actuals.Check_Aliased_Parameter): Adjust + wording for the error messages for actuals of aliased parameters. + (Resolve_Allocator): Likewise for allocators. + (Valid_Conversion): Likewise for conversions. + (Valid_Array_Conversion): Add Opnd_Type parameter instead of using + an up-level reference. + +2026-09-22 Eric Botcazou + + * exp_attr.adb (Expand_N_Attribute_Reference) : + Call Is_Reverse_Storage_Order_Object to detect cases where a copy + needs to be created for the prefix. + * sem_util.ads (In_Reverse_Storage_Order_Object): Delete. + (Is_Reverse_Storage_Order_Object): New predicate. + * sem_util.adb (In_Reverse_Storage_Order_Object): Delete. + (Is_Reverse_Storage_Order_Object): New predicate subsuming original + In_Reverse_Storage_Order_Object predicate. + +2026-09-22 Eric Botcazou + + * sem_ch4.adb (Analyze_Membership_Op): Do not force an error to be + given if the right operand is a Raise_Error node. + +2026-09-22 Eric Botcazou + + * accessibility.adb (Check_Return_Construct_Accessibility): Bail + out for the return synthesized in a function whose body has been + wrapped in a nested _Wrapped_Statements function. + +2026-09-22 Eric Botcazou + + * exp_ch3.adb (Make_Predefined_Primitive_Eq_Spec): Fix pasto. + * sem_ch4.adb (wpo): Also accept untagged types. + * sem_ch6.adb (Make_Inequality_Operator): Also copy Is_Primitive. + (New_Overloaded_Entity): Create the implicit inequality operator + only for nonderived subprograms, but create it in the asymmetric + case even for tagged types. Deal with the inheritance of such an + implicit inequality operator. + * sem_disp.adb: Add clauses for Stand. + (Check_Dispatching_Operation): Bail out for inequality operators + whose result type is Boolean. + +2026-09-22 Eric Botcazou + + * gen_il-gen-gen_entities.adb (Type_Kind): Set Base_Type_Only for + Is_Mutably_Tagged_Type flag. Move Class_Wide_Equivalent_Type to... + (Class_Wide_Kind): ...here. + * einfo.ads (Class_Wide_Equivalent_Type): Adjust description. + (Is_Controlled_Active): Likewise. + (Is_Controlled): Likewise. + (Is_Mutably_Tagged_Type): Likewise. + * exp_ch3.adb (Expand_N_Full_Type_Declaration): Use an assignment to + initialize an object of a mutably tagged type whose initial value is + not the result of a function call. + * exp_ch5.adb (Expand_N_Assignment_Statement): Do not dispatch to an + _assign primitive for an initialization even in the class-wide case. + For mutably tagged types, assign the tag unconditionally. + (Make_Tag_Ctrl_Assignment): Deal with mutably tagged types. + * exp_ch6.adb (Might_Have_Tasks): Invoke Has_Enabled_Aspect on the + root type for a class-wide type. + * exp_ch7.adb: Add clauses for Mutably_Tagged package. + (Make_Adjust_Call): Deal with mutably tagged types. + (Make_Final_Call): Likewise. + (Make_Init_Call): Likewise. + * exp_util.adb: Add clauses for Mutably_Tagged package. + (Finalize_Address): Deal with mutably tagged types. + (Make_CW_Equivalent_Type): Adjust comment. + * freeze.adb (Freeze_Record_Type): Invoke Needs_Finalization on the + type of the components to compute the Has_Controlled_Component flag. + * mutably_tagged.ads (Get_Corresponding_Tagged_Type_If_Present): + Adjust description. + * mutably_tagged.adb (Is_Mutably_Tagged_CW_Equivalent_Type): Test + Is_Mutably_Tagged_Type on the class-wide type of the parent subtype. + * sem_ch3.adb (Find_Type_Name): Do not set the Is_Internal flag on + the completion of an incomplete type. + (Record_Type_Definition): Invoke Needs_Finalization on the type of + the components to compute the Has_Controlled_Component flag. + * sem_ch12.adb (Validate_Private_Type_Instance): Test the + Is_Mutably_Tagged_Type flag instead of Class_Wide_Equivalent_Type. + (Instantiate_Type): Likewise. + * sem_util.adb (Needs_Finalization): Return False for a class-wide + type if the root type has the No_Controlled_Parts aspect, and return + True for a mutably tagged class-wide equivalent type unless the root + type has the No_Controlled_Parts aspect. + +2026-09-22 Eric Botcazou + + * freeze.adb (Freeze_Full_Expression): Also freeze the stand-alone + objects of the current scope when they are referenced. + * sem_ch6.adb (Analyze_Expression_Function): Do not check the use + of a dynamically tagged expression if an error has been posted. + +2026-09-22 Eric Botcazou + + * freeze.ads (Freeze_Entity): Move around. + (Freeze_Before): Rename T parameter to E. + (Freeze_Expression): Improve description. + (Freeze_Expr_Types_Before): Rename to... + (Freeze_Full_Expression_Before): ...this. + * freeze.adb (Freeze_Expr_Types): Rename to... + (Freeze_Full_Expression): ...this. + (Freeze_Before): Rename T parameter to E and Pack variable to Scop. + (Freeze_Entity): Adjust to above renaming. + (Freeze_Expression): Likewise. + (Freeze_Expr_Types_Before): Rename to... + (Freeze_Full_Expression_Before): ...this. + * contracts.adb (Analyze_Entry_Or_Subprogram_Contract): Adjust to + above renaming. + (Expand_Subprogram_Contract): Likewise. + * sem_ch6.adb (Analyze_Expression_Function): Likewise. + +2026-09-22 Eric Botcazou + + * sinfo.ads (Selector_Name): Beef up description. + * sem_ch3.adb (Contains_Lib_Incomplete_Type): Delete. + (Analyze_Declarations): Remove obsolete code. + * sem_ch13.adb (Resolve_Aspect_Expressions.Resolve_Name): Resolve + only names that are not selector names. + +2026-09-22 Eric Botcazou + + * exp_ch6.adb (Expand_Simple_Function_Return): Fix typo. + +2026-09-22 Eric Botcazou + + * accessibility.ads (Needs_Accessibility_Level_Temp_Or_Check): + Delete. + * accessibility.adb: Add clauses for Sem_Eval. + (Accessibility_Level): Add support for conditional expressions. + (Needs_Accessibility_Level_Temp_Or_Check): Delete. + * exp_ch4.adb (Expand_N_If_Expression): Do not force expansion for + the sake of accessibility checks. + * exp_ch6.adb (Create_Extra_Actuals): Remove specific support of + extra accessibility formal for conditional expressions. + * sem_eval.ads (Match_Result): New enumeration type moved from... + (Choices_Match): New function declaration moved from... + (Set_Checking_Potentially_Static_Expression): Alphabetize. + * sem_eval.adb (Match_Result): ...here. + (Choices_Match): ...here. + (Eval_Case_Expression): Replace loop with call to Choices_Match. + +2026-09-22 Eric Botcazou + + * exp_ch4.adb (Is_Copy_Type): New global predicate. + (Expand_N_Case_Expression.Is_Copy_Type): Delete. + (Expand_N_Expression_With_Actions.Is_Copy_Type): Likewise. + (Expand_N_If_Expression.Is_Copy_Type): Likewise. + * layout.adb (Layout_Type): Compute the size(s) of a 1-dimensional + array type in more cases. + * sem_attr.adb (Analyze_Access_Attribute): Add guard. + * sem_ch13.adb (Analyze_Attribute_Definition_Clause) + : Reset the size(s) if the clause is not confirming. + * sem_eval.adb (Compile_Time_Known_Bounds): Bail out if an error has + been posted on the range node. + * sem_res.adb (Valid_Conversion): Return early on N_Raise_xxx_Error. + +2026-09-22 Eric Botcazou + + * gen_il-fields.ads (Opt_Field_Enum): Remove Minimum_Accessibility + and add Extra_Accessibility_Of_Subprogram. + * gen_il-gen-gen_entities.adb (Formal_Kind): Likewise. + (Subprogram_Kind): Likewise. + * einfo.ads (Extra_Accessibility_Of_Subprogram): Add description. + (Minimum_Accessibility): Remove description. + * accessibility.ads (Accessibility_Level_Kind): Move to... + (Accessibility_Level): Move to... + (Dynamic_Accessibility_Level): New function declaration. + (Dynamic_Local_Access_Level): Likewise. + (Dynamic_Subprogram_Access_Level): Likewise. + (Get_Dynamic_Accessibility): Delete. + (Static_Accessibility_Level_Kind): Likewise. + (Deepest_Type_Access_Level): Likewise. + (Static_Accessibility_Level): Replace second formal parameter. + (Static_Local_Access_Level): New function declaration. + (Static_Type_Access_Level): Likewise. + (Subprogram_Access_Level): Delete. + (Type_Access_Level): Move to... + * accessibility.adb (Accessibility_Level_Kind): ...here. + (Accessibility_Level): ...here. + (Type_Access_Level): ...here. + (Offset_Static_Level): New function declaration. + (Accessibility_Level): Add Static formal parameter and change the + result type. Change the result type of most nested functions and + ultimately call Offset_Static_Level if Static is set to False. + (Apply_Accessibility_Check_For_Class_Wide_Allocator): Use explicit + static or dynamic variant of level computation functions. + (Apply_Accessibility_Check_For_Anonymous_Return): Likewise. + (Apply_Accessibility_Check_For_Class_Wide_Return): Likewise. + (Apply_Accessibility_Check_For_Discriminated_Allocator): Likewise. + (Apply_Accessibility_Check_For_Conversion): Likewise. + (Check_Return_Construct_Accessibility): Likewise. + (Apply_Accessibility_Check_For_Return): Fix typo in comment. + (Dynamic_Accessibility_Level): New function body. + (Dynamic_Local_Access_Level): Likewise. + (Dynamic_Subprogram_Access_Level): Likewise. + (Dynamic_Type_Access_Level): Likewise. + (Get_Dynamic_Accessibility): Delete. + (Offset_Static_Level): New function body. + (Static_Accessibility_Level): Adjust. + (Static_Local_Access_Level): New function body. + (Static_Subprogram_Access_Level): Likewise. + (Static_Type_Access_Level): Likewise. + (Deepest_Type_Access_Level): Merge implementation into... + (Type_Access_Level): ...this. Add Deepest formal parameter and + change the result type. Compute a base entity and an offset. + * contracts.adb (Build_Subprogram_Contract_Wrapper): Do not move the + declaration of the Extra_Accessibility_Of_Subprogram constant. + * exp_aggr.adb: Add clauses for Accessibility. + (In_Place_Assign_OK): Call Static_Local_Access_Level instead of + doing the level calculation manually. + * exp_attr.adb (Expand_N_Attribute_Reference.Write_Controlling_Tag): + Call appropriate accessibility level calculation routine. + * exp_ch3.adb (Build_Initialization_Call): Likewise. + (Expand_N_Object_Declaration): Likewise. + (Freeze_Type): Likewise. + (Build_Record_Init_Proc): Do not create an extra accessibility + parameter for Activation_Chain and Finalization_Master. + * exp_ch4.adb (Expand_N_In): Call appropriate acccessibility level + calculation routine. + * exp_ch5.adb (Expand_N_Assignment_Statement): Likewise. + * exp_ch6.adb (Expand_Actuals): Likewise. + (Create_Extra_Actuals): Likewise. + * exp_ch9.adb (Expand_N_Requeue_Statement): Likewise and add missing + exception per RM 9.5.4(7.2). + * exp_disp.adb (Make_DT): Likewise. + * sem_attr.adb (Resolve_Attribute): Likewise. + * sem_ch3.adb (Analyze_Component_Declaration): Likewise. + (Build_Derived_Record_Type): Likewise. + (Derived_Type_Declaration): Likewise. + * sem_ch9.adb (Analyze_Requeue): Likewise and remove duplicate code. + * sem_ch13.adb (Analyze_Attribute_Definition_Clause): Likewise. + * sem_res.ads (Resolve_Entry): Remove obsolete comment. + * sem_res.adb (Resolve_Actuals): Likewise. + (Resolve_Allocator): Likewise. + (Valid_Conversion): Likewise. + (Resolve_Entry): Set Analyzed on the entry name before rewriting it. + * sem_util.adb (Check_Unprotected_Access): Likewise. + * sem_ch6.adb (Analyze_Function_Return): Likewise. + (Analyze_Subprogram_Body_Helper): Compute the extra accessibility + of the subprogram instead of minimum accessibility of parameters. + (Create_Extra_Formals): Create an extra accessibility formal for + an access-to-subprogram parameter if the profile of the designated + type has at least one parameter that needs one. + +2026-09-22 Eric Botcazou + + * exp_ch3.adb (Expand_Freeze_Record_Type): Move up early return for + types derived from an untagged private type. + +2026-09-22 Andrew Teylu + + * libgnat/s-dwalin.ads (Dwarf_Context): Add Has_Line_Str. + * libgnat/s-dwalin.adb (Open): Set Has_Line_Str when creating the + line-string stream. + (Close): Close the line-string stream if it was created. + +2026-09-22 Viljar Indus + + * gcc-interface/trans.cc (can_equal_min_Or_max_val_p): Add guard + for integral types. + +2026-09-22 Eric Botcazou + + * gcc-interface/decl.cc (allocatable_size_p): Add INTERFACE_P + parameter and return true for any fixed size when it is true. + (gnat_to_gnu_entity): Add EXPORTED_P local variable and use it + throughout. + : Adjust calls to allocatable_size_p by passing true + for INTERFACE_P if the object is exported or imported. Remove + unreachable code giving a warning for too large imported objects. + +2026-09-21 Eric Botcazou + + * gcc-interface/misc.cc (gnat_get_array_descr_info): Return the + TYPE_REVERSE_STORAGE_ORDER flag of the underlying array type. + 2026-09-08 Kael Andrew Alonzo Franco PR middle-end/126622 diff --git a/gcc/ada/accessibility.adb b/gcc/ada/accessibility.adb index 34d5e6b085f3..852b57e41dfd 100644 --- a/gcc/ada/accessibility.adb +++ b/gcc/ada/accessibility.adb @@ -43,6 +43,7 @@ with Rtsfind; use Rtsfind; with Sem; use Sem; with Sem_Aux; use Sem_Aux; with Sem_Ch8; use Sem_Ch8; +with Sem_Eval; use Sem_Eval; with Sem_Res; use Sem_Res; with Sem_Util; use Sem_Util; with Sinfo.Nodes; use Sinfo.Nodes; @@ -57,6 +58,65 @@ package body Accessibility is -- Local Subprograms -- ----------------------- + type Accessibility_Level_Kind is + (Dynamic_Level, Object_Decl_Level, Library_On_Dynamic_Level); + -- Captures the different modes in which an accessibility level could be + -- obtained for a given expression. In the context of Accessibility_Level + -- function, Accessibility_Level_Kind signals what type of accessibility + -- level to obtain. + + -- When Level is Dynamic_Level, a defining identifier associated with an + -- access parameter, an access result, or an SAOOAAAT, may be returned. + -- For a conditional expression, another conditional expression may be + -- returned. An N_Integer_Literal node is returned in the other cases. + + -- When Level is Object_Decl_Level, an N_Integer_Literal node whose value + -- is the level of the declaration of the object is returned in the cases + -- where Dynamic_Level returns a defining identifier. For a conditional + -- expression whose dependent expression is *not* statically selected, an + -- assertion failure is raised. In the other cases, an N_Integer_Literal + -- node is returned like for Dynamic_Level. + + -- When Level is Library_On_Dynamic_Level, an N_Integer_Literal node whose + -- value is the library level is returned in the cases where Dynamic_Level + -- returns a defining identifier. Likewise for a conditional expression + -- whose dependent expression is *not* statically selected. In the other + -- cases, an N_Integer_Literal node is returned like for Dynamic_Level. + + -- Note that this description does not take into account the dynamic offset + -- that may be added by Offset_Static_Level to an N_Integer_Literal node. + + type Level_T (S : Boolean := False) is record + case S is + when False => N : Node_Id; + when True => U : Uint; + end case; + end record; + -- Result type of the Accessibility_Level function, containing an integer + -- when Static is True or a Node_Id when Static is False, see below. + + function Accessibility_Level + (Expr : Node_Id; + Level : Accessibility_Level_Kind; + Static : Boolean := False; + In_Return_Context : Boolean := False; + Allow_Alt_Model : Boolean := True) return Level_T; + -- Centralized accessibility level calculation routine for finding the + -- accessibility level of a given expression Expr. Level is as described + -- above. If Static is True, the result is meant for a static context, + -- typically a static accessibility check, and is therefore required to + -- be a value of Level_T (S => True) subtype (which also means that Level + -- cannot be Dynamic_Level in this case); otherwise, the result is meant + -- for a dynamic context, typically a dynamic accessibility check, and is + -- therefore required to be a value of Level_T (S => False) subtype. + + -- In_Return_Context forces the level calculation to be carried out as if + -- Expr was an operative constituent of a return value; when it is False, + -- the function computes whether that is the case or not. + + -- The Allow_Alt_Model parameter allows the alternative level calculation + -- under the restriction No_Dynamic_Accessibility_Checks to be performed. + procedure Apply_Accessibility_Check_For_Anonymous_Return (Exp : Node_Id; Func : Entity_Id; @@ -86,14 +146,54 @@ package body Accessibility is -- access discriminant of the result is not deeper than the level of the -- master of the call. Exp is an expression being returned from Func. + function Offset_Static_Level + (Level : Uint; + Subp : Entity_Id) return Node_Id; + -- Apply the offset scheme described for Extra_Accessibility_Of_Subprogram + -- in Einfo to Level computed within subprogram Subp and return the result. + -- The function must be invoked for every static accessibility level, both + -- for entities declared, and master constructs present, within Subp, when + -- a dynamic accessibility level is being computed. + + type Type_Level_T is record + Base : Entity_Id; + Offset : Uint; + end record; + -- Result type of the Type_Access_Level function, containing a base entity + -- and an offset. The static accessibility level of the input type is the + -- sum of the local accessibility level of the base entity and the offset. + + function Type_Access_Level + (Typ : Entity_Id; + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True; + Assoc_Node : Node_Id := Empty) return Type_Level_T; + -- Return the static accessibility level of Typ + + -- When Deepest is True, and Typ is that of an Ada 2012 stand-alone object + -- of an anonymous access type, then return the static accessibility level + -- of the declaration of the object instead of the library level; moreover, + -- in the case of a descendant of a generic formal type, return Int'Last + -- instead of the library level. + + -- The Allow_Alt_Model parameter allows the alternative level calculation + -- under the restriction No_Dynamic_Accessibility_Checks to be performed. + + -- Assoc_Node allows for the optional specification of a node associated + -- with Typ. This is used only for anonymous access types where the context + -- matters in interpreting Typ's level. + --------------------------- -- Accessibility_Message -- --------------------------- procedure Accessibility_Message (N : Node_Id; Typ : Entity_Id) is - Loc : constant Source_Ptr := Sloc (N); - P : constant Node_Id := Prefix (N); - Indic : Node_Id := Parent (Parent (N)); + Loc : constant Source_Ptr := Sloc (N); + P : constant Node_Id := Prefix (N); + Msg : constant String := + "nonlocal access value cannot designate local object (RM 3.10.2(28))"; + + Indic : Node_Id; begin -- In an instance, this is a runtime check, but one we know will fail, @@ -104,8 +204,7 @@ package body Accessibility is Error_Msg_Warn := SPARK_Mode /= On and then not No_Dynamic_Accessibility_Checks_Enabled (P); - Error_Msg_F - ("non-local pointer cannot point to local object<<", P); + Error_Msg_F (Msg & "<<", P); Error_Msg_F ("\Program_Error [<<", P); Rewrite (N, Make_Raise_Program_Error (Loc, @@ -113,7 +212,7 @@ package body Accessibility is Set_Etype (N, Typ); else - Error_Msg_F ("non-local pointer cannot point to local object", P); + Error_Msg_F (Msg, P); -- Check for case where we have a missing access definition @@ -146,53 +245,76 @@ package body Accessibility is function Accessibility_Level (Expr : Node_Id; Level : Accessibility_Level_Kind; + Static : Boolean := False; In_Return_Context : Boolean := False; - Allow_Alt_Model : Boolean := True) return Node_Id + Allow_Alt_Model : Boolean := True) return Level_T is Loc : constant Source_Ptr := Sloc (Expr); - function Accessibility_Level (Expr : Node_Id) return Node_Id is + function Accessibility_Level (Expr : Node_Id) return Level_T is (Accessibility_Level - (Expr, Level, In_Return_Context, Allow_Alt_Model)); + (Expr, Level, Static, In_Return_Context, Allow_Alt_Model)); -- Renaming of the enclosing function to facilitate recursive calls - function Make_Level_Literal (Level : Uint) return Node_Id; - -- Construct an integer literal representing an accessibility level with - -- its type set to Natural. - - function Innermost_Master_Scope_Depth (N : Node_Id) return Uint; - -- Returns the scope depth of the given node's innermost enclosing scope - -- (effectively the accessibility level of the innermost enclosing - -- master). + function Enclosing_Master_Level (N : Node_Id) return Level_T; + -- Return the accessibility level of the innermost enclosing master - function Function_Call_Or_Allocator_Level (N : Node_Id) return Node_Id; + function Function_Call_Or_Allocator_Level (N : Node_Id) return Level_T; -- Centralized processing of subprogram calls which may appear in prefix -- notation. - function Typ_Access_Level (Typ : Entity_Id) return Uint - is (Type_Access_Level (Typ, Allow_Alt_Model)); - -- Renaming of Type_Access_Level with Allow_Alt_Model specified to avoid - -- passing the parameter specifically in every call. + function Library_Level return Level_T; + -- Return the library level - ---------------------------------- - -- Innermost_Master_Scope_Depth -- - ---------------------------------- + function Local_Access_Level (E : Entity_Id) return Level_T is + (if Static + then (S => True, U => Static_Local_Access_Level (E)) + else (S => False, N => Dynamic_Local_Access_Level (E))); + -- Local renaming to select the appropriate variant for entities - function Innermost_Master_Scope_Depth (N : Node_Id) return Uint is - Encl_Scop : Entity_Id; - Ent : Entity_Id; - Node_Par : Node_Id := Parent (N); - Master_Lvl_Modifier : Int := 0; + function Make_Level_Literal (Level : Uint) return Node_Id; + -- Construct an integer literal representing an accessibility level with + -- its type set to Natural. + + function Make_Level_Value (Level : Uint) return Level_T; + -- Construct an accessibility level value with from static Level + + function Subprogram_Access_Level (Subp : Entity_Id) return Level_T is + (if Static + then (S => True, U => Static_Subprogram_Access_Level (Subp)) + else (S => False, N => Dynamic_Subprogram_Access_Level (Subp))); + -- Local renaming to select the appropriate variant for subprograms + + function Type_Access_Level (Typ : Entity_Id) return Level_T is + (if Static + then (S => True, + U => Static_Type_Access_Level + (Typ, Allow_Alt_Model => Allow_Alt_Model)) + else (S => False, + N => Dynamic_Type_Access_Level + (Typ, Allow_Alt_Model => Allow_Alt_Model))); + -- Local renaming to select the appropriate variant for types + + ---------------------------- + -- Enclosing_Master_Level -- + ---------------------------- + + function Enclosing_Master_Level (N : Node_Id) return Level_T is + Encl_Scop : Entity_Id; + Ent : Entity_Id; + Level_Modifier : Int := 0; + Node_Par : Node_Id; begin -- Locate the nearest enclosing node (by traversing Parents) -- that Defining_Entity can be applied to, and return the - -- depth of that entity's nearest enclosing dynamic scope. + -- level of that entity's nearest enclosing dynamic scope. -- The RM 7.6.1(3) definition of "master" includes statements -- and conditions for loops among other things. Are these cases -- detected properly ??? + Node_Par := Parent (N); while Present (Node_Par) loop Ent := Defining_Entity_Or_Empty (Node_Par); @@ -208,25 +330,43 @@ package body Accessibility is or else (Nkind (Node_Par) = N_Object_Renaming_Declaration and then Comes_From_Iterator (Node_Par)) then + -- Note that in some rare cases the scope depth may not be + -- set, for example, when we are in the middle of analyzing + -- a type and the enclosing scope is said type. In that case + -- simply return the library level. + + if not Scope_Depth_Set (Encl_Scop) then + return Library_Level; + end if; + -- Handle the case of expressions within library level -- subprograms here by adding one to the level modifier. if Encl_Scop = Standard_Standard and then Nkind (Node_Par) = N_Subprogram_Body then - Master_Lvl_Modifier := Master_Lvl_Modifier + 1; + Level_Modifier := Level_Modifier + 1; end if; - -- Note that in some rare cases the scope depth may not be - -- set, for example, when we are in the middle of analyzing - -- a type and the enclosing scope is said type. In that case - -- simply return zero for the outermost scope. + declare + Subp : constant Entity_Id := + (if Is_Subprogram (Encl_Scop) + then Encl_Scop + else Enclosing_Subprogram (Encl_Scop)); + Static_Level : constant Uint := + Scope_Depth (Encl_Scop) + Level_Modifier; - if Scope_Depth_Set (Encl_Scop) then - return Scope_Depth (Encl_Scop) + Master_Lvl_Modifier; - else - return Uint_0; - end if; + begin + if Static then + return (S => True, U => Static_Level); + elsif No (Subp) then + return (S => False, + N => Make_Level_Literal (Static_Level)); + else + return (S => False, + N => Offset_Static_Level (Static_Level, Subp)); + end if; + end; end if; -- For a return statement within a function, return @@ -238,7 +378,19 @@ package body Accessibility is elsif Nkind (Node_Par) in N_Extended_Return_Statement | N_Simple_Return_Statement then - return Scope_Depth (Enclosing_Subprogram (Node_Par)); + declare + Subp : constant Entity_Id := + Enclosing_Subprogram (Node_Par); + Static_Level : constant Uint := Scope_Depth (Subp); + + begin + if Static then + return (S => True, U => Static_Level); + else + return (S => False, + N => Offset_Static_Level (Static_Level, Subp)); + end if; + end; -- Non-package bodies and statements are counted as masters @@ -247,8 +399,7 @@ package body Accessibility is | N_Task_Body or else Is_Statement (Node_Par) then - Master_Lvl_Modifier := Master_Lvl_Modifier + 1; - + Level_Modifier := Level_Modifier + 1; end if; Node_Par := Parent (Node_Par); @@ -258,8 +409,17 @@ package body Accessibility is pragma Assert (False); - return Scope_Depth (Current_Scope) + 1; - end Innermost_Master_Scope_Depth; + return Make_Level_Value (Scope_Depth (Current_Scope) + 1); + end Enclosing_Master_Level; + + ------------------- + -- Library_Level -- + ------------------- + + function Library_Level return Level_T is + begin + return Make_Level_Value (Scope_Depth (Standard_Standard)); + end Library_Level; ------------------------ -- Make_Level_Literal -- @@ -273,11 +433,24 @@ package body Accessibility is return Result; end Make_Level_Literal; + ---------------------- + -- Make_Level_Value -- + ---------------------- + + function Make_Level_Value (Level : Uint) return Level_T is + begin + if Static then + return (S => True, U => Level); + else + return (S => False, N => Make_Level_Literal (Level)); + end if; + end Make_Level_Value; + -------------------------------------- -- Function_Call_Or_Allocator_Level -- -------------------------------------- - function Function_Call_Or_Allocator_Level (N : Node_Id) return Node_Id is + function Function_Call_Or_Allocator_Level (N : Node_Id) return Level_T is Prev_Par : Node_Id := Expr; Par : Node_Id := Parent (Expr); -- Par and Prev_Par will be used for traversing the AST, while @@ -296,19 +469,17 @@ package body Accessibility is if Is_Entity_Name (Name (N)) and then Is_Inherently_Limited_Type (Etype (N)) then - return Make_Level_Literal - (Subprogram_Access_Level (Entity (Name (N)))); + return Subprogram_Access_Level (Entity (Name (N))); elsif Nkind (Name (N)) = N_Explicit_Dereference and then Is_Inherently_Limited_Type (Etype (N)) then - return Make_Level_Literal - (Typ_Access_Level (Etype (Prefix (Name (N))))); + return Type_Access_Level (Etype (Prefix (Name (N)))); -- Otherwise the accessibility level of the innermost master else - return Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); end if; -- We ignore coextensions as they cannot be implemented under the @@ -318,12 +489,12 @@ package body Accessibility is and then (Is_Static_Coextension (N) or else Is_Dynamic_Coextension (N)) then - return Make_Level_Literal (Scope_Depth (Standard_Standard)); + return Library_Level; -- Objects of a named access type get their level from their type elsif Is_Named_Access_Type (Etype (N)) then - return Make_Level_Literal (Typ_Access_Level (Etype (N))); + return Type_Access_Level (Etype (N)); -- Function calls in Ada 2005 and later, and anonymous allocators @@ -339,7 +510,8 @@ package body Accessibility is -- designated type. if Debug_Flag_Underscore_B then - return Make_Level_Literal (Typ_Access_Level (Etype (N))); + return + Make_Level_Value (Static_Type_Access_Level (Etype (N))); -- For function calls the level is that of the innermost -- master; otherwise, for allocators we get the level of @@ -347,8 +519,7 @@ package body Accessibility is -- calculated through the normal path of execution. elsif Nkind (N) = N_Function_Call then - return - Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); end if; end if; @@ -360,15 +531,15 @@ package body Accessibility is and then Nkind (N) = N_Function_Call and then Is_Scalar_Type (Etype (N)) then - return Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); end if; - -- Dynamic checks are generated when we are within a return - -- value or we are in a function call within an anonymous - -- access discriminant constraint of a return object (signified - -- by In_Return_Context) on the side of the callee. + -- RM 3.10.2(10.5): If the call itself defines the result of a + -- function F, or has an accessibility level that is tied to the + -- result of such a function F, then the master of the call is + -- that of the master of the call invoking F. - if In_Return_Value (N) or else In_Return_Context then + if In_Return_Context or In_Return_Value (N) then declare Extra_Formal : constant Entity_Id := Extra_Accessibility_Of_Result (Current_Subprogram); @@ -382,14 +553,14 @@ package body Accessibility is -- "passed along". if Present (Extra_Formal) and then Level = Dynamic_Level then - return New_Occurrence_Of (Extra_Formal, Loc); + return (S => False, + N => New_Occurrence_Of (Extra_Formal, Loc)); -- Otherwise, return accessibility level of the enclosing -- subprogram. else - return Make_Level_Literal - (Subprogram_Access_Level (Current_Subprogram)); + return Subprogram_Access_Level (Current_Subprogram); end if; end; end if; @@ -434,17 +605,17 @@ package body Accessibility is when N_Type_Conversion => if Is_Named_Access_Type (Etype (Par)) then - return - Make_Level_Literal (Typ_Access_Level (Etype (Par))); + return Type_Access_Level (Etype (Par)); end if; -- For the (static) declaration of an object, return the -- accessibility level of the master of the object. when N_Object_Declaration => - return - Accessibility_Level - (Defining_Identifier (Par), Object_Decl_Level); + return Accessibility_Level + (Expr => Defining_Identifier (Par), + Level => Object_Decl_Level, + Static => Static); -- For the dynamic allocation of an object, return the -- accessibility level of the allocator. @@ -471,6 +642,7 @@ package body Accessibility is return Accessibility_Level (Expr => Name (Par), Level => Object_Decl_Level, + Static => Static, In_Return_Context => In_Return_Context); when others => @@ -486,7 +658,7 @@ package body Accessibility is -- Return the accessibility level of the innermost master - return Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); end if; end Function_Call_Or_Allocator_Level; @@ -498,6 +670,10 @@ package body Accessibility is -- Start of processing for Accessibility_Level begin + -- Make sure that we are not passed contradictory input + + pragma Assert (not (Level = Dynamic_Level and then Static)); + -- We could be looking at a reference to a formal due to the expansion -- of entries and other cases, so obtain the renaming if necessary. @@ -505,10 +681,20 @@ package body Accessibility is E := Param_Entity (Expr); -- Use the original node unless it is an unanalyzed identifier, as we - -- don't want to reason on unanalyzed expressions from predicates. - - elsif Nkind (Original_Node (Expr)) /= N_Identifier - or else Analyzed (Original_Node (Expr)) + -- don't want to reason on unanalyzed expressions from predicates, or + -- a folded conditional expression, since its level is ultimately that + -- of the dependent expression evaluated statically in this case. + + elsif not (Nkind (Original_Node (Expr)) = N_Identifier + and then not Analyzed (Original_Node (Expr))) + and then not (Nkind (Original_Node (Expr)) = N_Case_Expression + and then + Is_Static_Expression + (Expression (Original_Node (Expr)))) + and then not (Nkind (Original_Node (Expr)) = N_If_Expression + and then + Is_Static_Expression + (First (Expressions (Original_Node (Expr))))) then E := Original_Node (Expr); @@ -537,13 +723,13 @@ package body Accessibility is -- The accessibility level of the literal null is the library level when N_Null => - return Make_Level_Literal (Scope_Depth (Standard_Standard)); + return Library_Level; -- The level of an aggregate is that of the innermost master that -- evaluates it as defined in RM 3.10.2 (10/4). when N_Aggregate => - return Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); -- The accessibility level is that of the access type, except for -- anonymous allocators which have special rules defined in RM 3.10.2 @@ -579,9 +765,8 @@ package body Accessibility is -- Return the level of the enclosing declaration - return Make_Level_Literal - (Innermost_Master_Scope_Depth - (Enclosing_Declaration (Expr))); + return + Enclosing_Master_Level (Enclosing_Declaration (Expr)); -- Return the library level to null out the check for the Address, -- Deref, Unchecked_Access and Unrestricted_Access attributes. @@ -591,7 +776,7 @@ package body Accessibility is | Name_Unchecked_Access | Name_Unrestricted_Access then - return Make_Level_Literal (Scope_Depth (Standard_Standard)); + return Library_Level; -- For 'Old return the level of the associated entity, if any @@ -617,18 +802,19 @@ package body Accessibility is -- Named access types if Is_Named_Access_Type (Etype (Pre)) then - return Make_Level_Literal (Typ_Access_Level (Etype (Pre))); + return Type_Access_Level (Etype (Pre)); -- Anonymous access types elsif Is_Entity_Name (Pre) and then Ekind (Entity (Pre)) not in Subprogram_Kind - and then Present (Get_Dynamic_Accessibility (Entity (Pre))) + and then Present (Extra_Accessibility (Entity (Pre))) and then Level = Dynamic_Level then pragma Assert (Is_Anonymous_Access_Type (Etype (Pre))); - return New_Occurrence_Of - (Get_Dynamic_Accessibility (Entity (Pre)), Loc); + return (S => False, + N => New_Occurrence_Of + (Extra_Accessibility (Entity (Pre)), Loc)); -- Otherwise the level is treated in a similar way as -- aggregates according to RM 6.1.1 (35.1/4) which concerns @@ -637,8 +823,7 @@ package body Accessibility is -- declaration. else - return Make_Level_Literal - (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); end if; else @@ -671,48 +856,45 @@ package body Accessibility is and then Wrapped_Statements (Scope (E)) = Current_Subprogram)) - and then (In_Return_Value (Expr) or else In_Return_Context) + and then (In_Return_Context or else In_Return_Value (Expr)) then - return Make_Level_Literal (Scope_Depth (Standard_Standard)); + return Library_Level; -- Formal parameters with an extra accessibility formal, as well -- as stand-alone objects of an anonymous access type (SAOOAAAT). elsif (Is_Formal (E) or else Ekind (E) in E_Constant | E_Variable) - and then Present (Get_Dynamic_Accessibility (E)) - and then Level in Dynamic_Level | Zero_On_Dynamic_Level + and then Present (Extra_Accessibility (E)) + and then Level in Dynamic_Level | Library_On_Dynamic_Level then - if Level = Zero_On_Dynamic_Level then - return Make_Level_Literal (Scope_Depth (Standard_Standard)); - end if; + -- Return the library level if explicitly requested + + if Level = Library_On_Dynamic_Level then + return Library_Level; -- No_Dynamic_Accessibility_Checks restriction override for -- alternative accessibility model. - if Allow_Alt_Model + elsif Allow_Alt_Model and then No_Dynamic_Accessibility_Checks_Enabled (E) then -- In the alternative model the level is that of the -- designated type entity's context. if Debug_Flag_Underscore_B then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); - - -- Otherwise the level depends on the entity's context - - elsif Is_Formal (E) then - return Make_Level_Literal - (Subprogram_Access_Level - (Enclosing_Subprogram (E))); + return Make_Level_Value + (Static_Type_Access_Level (Etype (E))); else - return Make_Level_Literal - (Scope_Depth (Enclosing_Dynamic_Scope (E))); + return Make_Level_Value (Static_Local_Access_Level (E)); end if; - end if; -- Return the dynamic level in the normal case - return New_Occurrence_Of (Get_Dynamic_Accessibility (E), Loc); + else + return + (S => False, + N => New_Occurrence_Of (Extra_Accessibility (E), Loc)); + end if; -- Return the library level for formal parameters or stand-alone -- objects of an anonymous access type without extra accessibility @@ -723,21 +905,24 @@ package body Accessibility is elsif (Is_Formal (E) or else Ekind (E) in E_Constant | E_Variable) and then Is_Anonymous_Access_Type (Etype (E)) and then not Is_Local_Anonymous_Access (Etype (E)) - and then Level in Dynamic_Level | Zero_On_Dynamic_Level + and then Level in Dynamic_Level | Library_On_Dynamic_Level then - return Make_Level_Literal (Scope_Depth (Standard_Standard)); + return Library_Level; -- Initialization procedures have a special extra accessibility -- parameter associated with the level at which the object -- being initialized exists - elsif Ekind (E) = E_Record_Type + elsif Level = Dynamic_Level + and then Ekind (E) = E_Record_Type and then Is_Limited_Record (E) and then Current_Scope = Init_Proc (E) and then Present (Init_Proc_Level_Formal (Current_Scope)) then - return New_Occurrence_Of - (Init_Proc_Level_Formal (Current_Scope), Loc); + return + (S => False, + N => New_Occurrence_Of + (Init_Proc_Level_Formal (Current_Scope), Loc)); -- Current instance of the type is deeper than that of the type -- according to RM 3.10.2 (21). @@ -750,12 +935,20 @@ package body Accessibility is and then No_Dynamic_Accessibility_Checks_Enabled (E) and then Debug_Flag_Underscore_B then - return Make_Level_Literal (Typ_Access_Level (E)); + return Make_Level_Value (Static_Type_Access_Level (E)); end if; -- Normal path - return Make_Level_Literal (Typ_Access_Level (E) + 1); + if Static then + return (S => True, U => Static_Type_Access_Level (E) + 1); + else + return + (S => False, + N => Make_Op_Add (Loc, + Left_Opnd => Dynamic_Type_Access_Level (E), + Right_Opnd => Make_Level_Literal (Uint_1))); + end if; -- Move up the renamed entity or object if it came from source -- since expansion may have created a dummy renaming under @@ -773,7 +966,7 @@ package body Accessibility is -- Objects of a named access type get their level from their type elsif Is_Named_Access_Type (Etype (E)) then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return Type_Access_Level (Etype (E)); -- Check if E is an expansion-generated renaming of an iterator -- by examining Related_Expression. If so, determine the @@ -789,20 +982,21 @@ package body Accessibility is and then Is_Subprogram (Scope (E)) and then Present (Init_Proc_Level_Formal (Scope (E))) then - return New_Occurrence_Of - (Init_Proc_Level_Formal (Scope (E)), Loc); + return + (S => False, + N => New_Occurrence_Of + (Init_Proc_Level_Formal (Scope (E)), Loc)); -- Formal object of generic subprogram - get the level of the -- subprogram elsif Is_Formal_Object (E) and then Is_Subprogram (Scope (E)) then - return Make_Level_Literal (Subprogram_Access_Level (Scope (E))); + return Subprogram_Access_Level (Scope (E)); - -- Normal object - get the depth of the enclosing dynamic scope + -- Normal object - get the local access level else - return Make_Level_Literal - (Scope_Depth (Enclosing_Dynamic_Scope (E))); + return Local_Access_Level (E); end if; -- Handle indexed and selected components including the special cases @@ -836,14 +1030,14 @@ package body Accessibility is -- of the named access type in the prefix. elsif Is_Named_Access_Type (Etype (Pre)) then - return Make_Level_Literal (Typ_Access_Level (Etype (Pre))); + return Type_Access_Level (Etype (Pre)); -- The current expression is a named access type, so there is no -- reason to look at the prefix. Instead obtain the level of E's -- named access type. elsif Is_Named_Access_Type (Etype (E)) then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return Type_Access_Level (Etype (E)); -- A nondiscriminant selected component where the component -- is an anonymous access type means that its associated @@ -885,13 +1079,13 @@ package body Accessibility is and then No_Dynamic_Accessibility_Checks_Enabled (E) and then Debug_Flag_Underscore_B then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return + Make_Level_Value (Static_Type_Access_Level (Etype (E))); end if; -- Otherwise proceed normally - return - Make_Level_Literal (Typ_Access_Level (Etype (Prefix (E)))); + return Type_Access_Level (Etype (Prefix (E))); -- The accessibility calculation routine that handles function -- calls (Function_Call_Or_Allocator_Level) assumes, in the case @@ -915,12 +1109,12 @@ package body Accessibility is if (Ekind (Etype (Pre)) = E_Anonymous_Access_Type or else Has_Implicit_Dereference (Etype (Pre))) - and then (In_Return_Value (E) or else In_Return_Context) + and then (In_Return_Context or else In_Return_Value (E)) then return Function_Call_Or_Allocator_Level (Prefix (E)); end if; - return Make_Level_Literal (Innermost_Master_Scope_Depth (Expr)); + return Enclosing_Master_Level (Expr); -- Otherwise, continue recursing over the expression prefixes @@ -928,11 +1122,108 @@ package body Accessibility is return Accessibility_Level (Prefix (E)); end if; + -- Conditional expressions: the accessibility level is the level of + -- the evaluated dependent expression (RM 3.10.2(9.1)). + + when N_Case_Expression => + -- If the expression is static, perform a static computation + + if Is_Static_Expression (Expression (E)) then + declare + Alt : Node_Id; + + begin + Alt := First (Alternatives (E)); + while Present (Alt) loop + if Choices_Match (Expression (E), Discrete_Choices (Alt)) + = Match + then + return Accessibility_Level (Expression (Alt)); + end if; + + Next (Alt); + end loop; + + raise Program_Error; + end; + + -- Or else, the expression is dynamic so, if the level is also + -- dynamic, we can perform a dynamic computation. + + elsif Level = Dynamic_Level then + declare + New_Alts : constant List_Id := New_List; + New_Case : constant Node_Id := + Make_Case_Expression (Loc, + Expression => Duplicate_Subexpr (Expression (E)), + Alternatives => New_Alts); + + Alt : Node_Id; + + begin + Alt := First (Alternatives (E)); + while Present (Alt) loop + Append_To (New_Alts, + Make_Case_Expression_Alternative (Sloc (Alt), + Discrete_Choices => Discrete_Choices (Alt), + Expression => + Accessibility_Level (Expression (Alt)).N)); + + Next (Alt); + end loop; + + return (S => False, N => New_Case); + end; + + -- Otherwise, the expression is dynamic but the level is static, + -- so return the library level to null out the check. + + else + pragma Assert (Level = Library_On_Dynamic_Level); + return Library_Level; + end if; + + when N_If_Expression => + declare + Condition : constant Node_Id := First (Expressions (E)); + Then_Expr : constant Node_Id := Next (Condition); + Else_Expr : constant Node_Id := Next (Then_Expr); + + begin + -- If the condition is static, perform a static computation + + if Is_Static_Expression (Condition) then + return + (if Is_True (Expr_Value (Condition)) + then Accessibility_Level (Then_Expr) + else Accessibility_Level (Else_Expr)); + + -- Or else, the condition is dynamic so, if the level is also + -- dynamic, we can perform a dynamic computation. + + elsif Level = Dynamic_Level then + return + (S => False, + N => Make_If_Expression (Loc, + Expressions => New_List ( + Duplicate_Subexpr (Condition), + Accessibility_Level (Then_Expr).N, + Accessibility_Level (Else_Expr).N))); + + -- Otherwise, the condition is dynamic but the level is static, + -- so return the library level to null out the check. + + else + pragma Assert (Level = Library_On_Dynamic_Level); + return Library_Level; + end if; + end; + -- Qualified expressions when N_Qualified_Expression => if Is_Named_Access_Type (Etype (E)) then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return Type_Access_Level (Etype (E)); else return Accessibility_Level (Expression (E)); end if; @@ -951,7 +1242,7 @@ package body Accessibility is -- its type. if Is_Named_Access_Type (Etype (Pre)) then - return Make_Level_Literal (Typ_Access_Level (Etype (Pre))); + return Type_Access_Level (Etype (Pre)); -- Otherwise, recurse deeper @@ -977,13 +1268,13 @@ package body Accessibility is -- access type. elsif Is_Named_Access_Type (Etype (E)) then - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return Type_Access_Level (Etype (E)); -- In section RM 3.10.2 (10/4) the accessibility rules for -- aggregates and value conversions are outlined. Are these -- followed in the case of initialization of an object ??? - -- Should use Innermost_Master_Scope_Depth ??? + -- Should use Enclosing_Master_Level ??? else return Accessibility_Level (Current_Scope); @@ -993,7 +1284,7 @@ package body Accessibility is -- expression's entity. when others => - return Make_Level_Literal (Typ_Access_Level (Etype (E))); + return Type_Access_Level (Etype (E)); end case; end Accessibility_Level; @@ -1024,7 +1315,8 @@ package body Accessibility is and then not Scope_Suppress.Suppress (Accessibility_Check) and then not No_Dynamic_Accessibility_Checks_Enabled (Ref) and then - (Type_Access_Level (Etype (Exp)) > Type_Access_Level (PtrT) + (Static_Type_Access_Level (Etype (Exp)) + > Static_Type_Access_Level (PtrT) or else (Is_Class_Wide_Type (Etype (Exp)) and then Scope (PtrT) /= Current_Scope)) @@ -1173,7 +1465,7 @@ package body Accessibility is Cond := Make_Op_Gt (Loc, Left_Opnd => Cond, - Right_Opnd => Accessibility_Level (N, Dynamic_Level)); + Right_Opnd => Dynamic_Accessibility_Level (N)); -- Due to the complexity and side effects of the check, utilize an if -- statement instead of the regular Program_Error circuitry. @@ -1251,8 +1543,8 @@ package body Accessibility is Condition => Make_Op_Gt (Loc, Left_Opnd => - Accessibility_Level - (Exp, Dynamic_Level, In_Return_Context => True), + Dynamic_Accessibility_Level + (Exp, In_Return_Context => True), Right_Opnd => New_Occurrence_Of (Extra_Accessibility_Of_Result (Func), Loc)), Reason => PE_Accessibility_Check_Failed), @@ -1283,8 +1575,8 @@ package body Accessibility is N_Type_Conversion | N_Unchecked_Type_Conversion or else (Is_Entity_Name (Exp) and then Is_Formal (Entity (Exp))) - or else Scope_Depth (Enclosing_Dynamic_Scope (Etype (Exp))) > - Subprogram_Access_Level (Func)) + or else Static_Type_Access_Level (Etype (Exp)) + > Static_Subprogram_Access_Level (Func)) then declare Tag_Node : Node_Id; @@ -1364,9 +1656,7 @@ package body Accessibility is Condition => Make_Op_Gt (Loc, Left_Opnd => Build_Get_Access_Level (Loc, Tag_Node), - Right_Opnd => - Make_Integer_Literal (Loc, - Subprogram_Access_Level (Func))), + Right_Opnd => Dynamic_Subprogram_Access_Level (Func)), Reason => PE_Accessibility_Check_Failed), Suppress => Access_Check); end; @@ -1426,8 +1716,8 @@ package body Accessibility is Make_Raise_Program_Error (Loc, Condition => Make_Op_Gt (Loc, - Left_Opnd => Accessibility_Level (Exp, Dynamic_Level), - Right_Opnd => Accessibility_Level (N, Dynamic_Level)), + Left_Opnd => Dynamic_Accessibility_Level (Exp), + Right_Opnd => Dynamic_Accessibility_Level (N)), Reason => PE_Accessibility_Check_Failed), Suppress => Access_Check); @@ -1456,9 +1746,8 @@ package body Accessibility is Make_Raise_Program_Error (Loc, Condition => Make_Op_Gt (Loc, - Left_Opnd => - Accessibility_Level (Discr_Exp, Dynamic_Level), - Right_Opnd => Accessibility_Level (N, Dynamic_Level)), + Left_Opnd => Dynamic_Accessibility_Level (Discr_Exp), + Right_Opnd => Dynamic_Accessibility_Level (N)), Reason => PE_Accessibility_Check_Failed), Suppress => Access_Check); end if; @@ -1648,14 +1937,14 @@ package body Accessibility is -- extra access level object and when accessibility checks are enabled. if Present (Param_Ent) - and then Present (Get_Dynamic_Accessibility (Param_Ent)) + and then Present (Extra_Accessibility (Param_Ent)) and then not Accessibility_Checks_Suppressed (Param_Ent) and then not Accessibility_Checks_Suppressed (Typ) then -- Obtain the parameter's accessibility level Param_Level := - New_Occurrence_Of (Get_Dynamic_Accessibility (Param_Ent), Loc); + New_Occurrence_Of (Extra_Accessibility (Param_Ent), Loc); -- Use the dynamic accessibility parameter for the function's result -- when one has been created instead of statically referring to the @@ -1684,8 +1973,7 @@ package body Accessibility is -- Otherwise get the type's accessibility level normally else - Type_Level := - Make_Integer_Literal (Loc, Deepest_Type_Access_Level (Typ)); + Type_Level := Dynamic_Type_Access_Level (Typ, Deepest => True); end if; -- Raise Program_Error if the accessibility level of the access @@ -1785,10 +2073,11 @@ package body Accessibility is procedure Accessibility_Error is Suffix : constant String := (if Is_Expression_Function_Or_Completion (Scope_Id) - then "in expression function" - else "in return"); + then " in expression function (RM 6.8(5))" + else " in return (RM 6.5(5.9))"); Message : constant String := - "level of type of access discriminant is too deep " & Suffix; + "accessibility level of access discriminant is too deep" + & Suffix; begin -- In an instance, this is a runtime check, but one we know will fail @@ -1851,11 +2140,14 @@ package body Accessibility is | N_Simple_Return_Statement); -- Only perform checks on record types with access discriminants and - -- functions present in the source. + -- functions present in the source, but no checks are needed for the + -- return synthesized in a function whose body has been wrapped in a + -- nested _Wrapped_Statements function. if not Is_Record_Type (R_Type) or else not Has_Anonymous_Access_Discriminant (R_Type) or else not Comes_From_Source (Scope_Id) + or else Present (Wrapped_Statements (Scope_Id)) then return; end if; @@ -1964,9 +2256,8 @@ package body Accessibility is -- Apply the RM 3.10.2(12.4) rule to formal parameters elsif Is_Entity_Name (Unqual) and then Is_Formal (Entity (Unqual)) then - if Static_Accessibility_Level - (Unqual, Zero_On_Dynamic_Level, In_Return_Context => True) - > Subprogram_Access_Level (Scope_Id) + if Static_Accessibility_Level (Unqual, In_Return_Context => True) + > Static_Subprogram_Access_Level (Scope_Id) then Accessibility_Error; end if; @@ -2216,8 +2507,8 @@ package body Accessibility is and then Ekind (Etype (Disc)) = E_Anonymous_Access_Type and then Static_Accessibility_Level - (Assoc_Expr, Zero_On_Dynamic_Level, In_Return_Context => True) - > Subprogram_Access_Level (Scope_Id) + (Assoc_Expr, In_Return_Context => True) + > Static_Subprogram_Access_Level (Scope_Id) then Accessibility_Error; end if; @@ -2240,46 +2531,89 @@ package body Accessibility is end loop; end Check_Return_Construct_Accessibility; - ------------------------------- - -- Deepest_Type_Access_Level -- - ------------------------------- + --------------------------------- + -- Dynamic_Accessibility_Level -- + --------------------------------- - function Deepest_Type_Access_Level - (Typ : Entity_Id; - Allow_Alt_Model : Boolean := True) return Uint + function Dynamic_Accessibility_Level + (Expr : Node_Id; + In_Return_Context : Boolean := False; + Allow_Alt_Model : Boolean := True) return Node_Id is begin - if Ekind (Typ) = E_Anonymous_Access_Type - and then not Is_Local_Anonymous_Access (Typ) - and then Nkind (Associated_Node_For_Itype (Typ)) = N_Object_Declaration - then - -- No_Dynamic_Accessibility_Checks override for alternative - -- accessibility model. + return + Accessibility_Level (Expr => Expr, + Level => Dynamic_Level, + Static => False, + In_Return_Context => In_Return_Context, + Allow_Alt_Model => Allow_Alt_Model).N; + end Dynamic_Accessibility_Level; - if Allow_Alt_Model - and then No_Dynamic_Accessibility_Checks_Enabled (Typ) - then - return Type_Access_Level (Typ, Allow_Alt_Model); - end if; + -------------------------------- + -- Dynamic_Local_Access_Level -- + -------------------------------- - -- Typ is the type of an Ada 2012 stand-alone object of an anonymous - -- access type. + function Dynamic_Local_Access_Level (E : Entity_Id) return Node_Id is + Loc : constant Source_Ptr := Sloc (E); + Static_Level : constant Uint := Static_Local_Access_Level (E); + Subp : constant Entity_Id := Enclosing_Subprogram (E); - return - Scope_Depth (Enclosing_Dynamic_Scope - (Defining_Identifier - (Associated_Node_For_Itype (Typ)))); + begin + if Present (Subp) then + return Offset_Static_Level (Static_Level, Subp); + else + return Make_Integer_Literal (Loc, Static_Level); + end if; + end Dynamic_Local_Access_Level; + + ------------------------------------- + -- Dynamic_Subprogram_Access_Level -- + ------------------------------------- + + function Dynamic_Subprogram_Access_Level (Subp : Entity_Id) return Node_Id + is + begin + if Present (Alias (Subp)) then + return Dynamic_Subprogram_Access_Level (Alias (Subp)); + else + return Dynamic_Local_Access_Level (Subp); + end if; + end Dynamic_Subprogram_Access_Level; - -- For generic formal type, return Int'Last (infinite). - -- See comment preceding Is_Generic_Type call in Type_Access_Level. + ------------------------------- + -- Dynamic_Type_Access_Level -- + ------------------------------- + + function Dynamic_Type_Access_Level + (Typ : Entity_Id; + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True) return Node_Id + is + Loc : constant Source_Ptr := Sloc (Typ); + Val : constant Type_Level_T := + Type_Access_Level (Typ, Deepest, Allow_Alt_Model, Empty); - elsif Is_Generic_Type (Root_Type (Typ)) then - return UI_From_Int (Int'Last); + begin + if Present (Val.Base) then + declare + Dynamic_Level : constant Node_Id := + Dynamic_Local_Access_Level (Val.Base); + + begin + if Val.Offset /= Uint_0 then + return + Make_Op_Add (Loc, + Left_Opnd => Dynamic_Level, + Right_Opnd => Make_Integer_Literal (Loc, Val.Offset)); + else + return Dynamic_Level; + end if; + end; else - return Type_Access_Level (Typ, Allow_Alt_Model); + return Make_Integer_Literal (Loc, Val.Offset); end if; - end Deepest_Type_Access_Level; + end Dynamic_Type_Access_Level; ------------------------- -- Extra_Accessibility -- @@ -2300,30 +2634,6 @@ package body Accessibility is end if; end Extra_Accessibility; - ------------------------------- - -- Get_Dynamic_Accessibility -- - ------------------------------- - - function Get_Dynamic_Accessibility (E : Entity_Id) return Entity_Id is - begin - -- When minimum accessibility is set for E then we utilize it - except - -- in a few edge cases like the expansion of select statements where - -- generated subprogram may attempt to unnecessarily use a minimum - -- accessibility object declared outside of scope. - - -- To avoid these situations where expansion may get complex we verify - -- that the minimum accessibility object is within scope. - - if Is_Formal (E) - and then Present (Minimum_Accessibility (E)) - and then In_Open_Scopes (Scope (Minimum_Accessibility (E))) - then - return Minimum_Accessibility (E); - end if; - - return Extra_Accessibility (E); - end Get_Dynamic_Accessibility; - ----------------------- -- Has_Access_Values -- ----------------------- @@ -2429,31 +2739,6 @@ package body Accessibility is return False; end Has_Unconstrained_Access_Discriminants; - --------------------------------------------- - -- Needs_Accessibility_Level_Temp_Or_Check -- - --------------------------------------------- - - function Needs_Accessibility_Level_Temp_Or_Check - (Conditional_Expr : Node_Id) return Boolean - is - Par : Node_Id; - begin - if Ekind (Etype (Conditional_Expr)) /= E_Anonymous_Access_Type then - return False; - end if; - - Par := Parent (Conditional_Expr); - while Present (Par) - and then Nkind (Par) in N_Case_Expression - | N_If_Expression - | N_Parameter_Association - loop - Par := Parent (Par); - end loop; - - return Nkind (Par) in N_Subprogram_Call | N_Assignment_Statement; - end Needs_Accessibility_Level_Temp_Or_Check; - -------------------------------------- -- Needs_Result_Accessibility_Level -- -------------------------------------- @@ -2592,6 +2877,41 @@ package body Accessibility is end if; end Needs_Result_Accessibility_Level; + ------------------------- + -- Offset_Static_Level -- + ------------------------- + + -- An alternate, more sophisticated formula could be: + -- + -- if Extra_Accessibility (Subp) > Static_Accessibility (Subp) + -- then Level + Extra_Accessibility (Subp) - Static_Accessibility (Subp) + -- else Level + -- + -- and would yield more progressive dynamic levels in call chains, but it + -- would complicate the run-time computation and not really buy anything. + + function Offset_Static_Level + (Level : Uint; + Subp : Entity_Id) return Node_Id + is + Loc : constant Source_Ptr := Sloc (Subp); + + begin + pragma Assert (Is_Subprogram (Subp)); + + if Present (Extra_Accessibility_Of_Subprogram (Subp)) then + return + Make_Op_Add (Loc, + Left_Opnd => + New_Occurrence_Of + (Extra_Accessibility_Of_Subprogram (Subp), Loc), + Right_Opnd => Make_Integer_Literal (Loc, Level)); + + else + return Make_Integer_Literal (Loc, Level); + end if; + end Offset_Static_Level; + ------------------------------------------ -- Prefix_With_Safe_Accessibility_Level -- ------------------------------------------ @@ -2664,45 +2984,102 @@ package body Accessibility is return True; end Prefix_With_Safe_Accessibility_Level; - ----------------------------- - -- Subprogram_Access_Level -- - ----------------------------- - - function Subprogram_Access_Level (Subp : Entity_Id) return Uint is - begin - if Present (Alias (Subp)) then - return Subprogram_Access_Level (Alias (Subp)); - else - return Scope_Depth (Enclosing_Dynamic_Scope (Subp)); - end if; - end Subprogram_Access_Level; - -------------------------------- -- Static_Accessibility_Level -- -------------------------------- function Static_Accessibility_Level (Expr : Node_Id; - Level : Static_Accessibility_Level_Kind; + Object_Decl_Level : Boolean := False; In_Return_Context : Boolean := False) return Uint is + Level : constant Accessibility_Level_Kind := + (if Object_Decl_Level + then Accessibility.Object_Decl_Level + else Library_On_Dynamic_Level); + begin - return Intval (Accessibility_Level (Expr, Level, In_Return_Context)); + return + Accessibility_Level (Expr => Expr, + Level => Level, + Static => True, + In_Return_Context => In_Return_Context).U; end Static_Accessibility_Level; + ------------------------------- + -- Static_Local_Access_Level -- + ------------------------------- + + function Static_Local_Access_Level (E : Entity_Id) return Uint is + begin + return Scope_Depth (Enclosing_Dynamic_Scope (E)); + end Static_Local_Access_Level; + + ------------------------------------ + -- Static_Subprogram_Access_Level -- + ------------------------------------ + + function Static_Subprogram_Access_Level (Subp : Entity_Id) return Uint is + begin + if Present (Alias (Subp)) then + return Static_Subprogram_Access_Level (Alias (Subp)); + else + return Static_Local_Access_Level (Subp); + end if; + end Static_Subprogram_Access_Level; + + ------------------------------ + -- Static_Type_Access_Level -- + ------------------------------ + + function Static_Type_Access_Level + (Typ : Entity_Id; + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True; + Assoc_Node : Node_Id := Empty) return Uint + is + Val : constant Type_Level_T := + Type_Access_Level (Typ, Deepest, Allow_Alt_Model, Assoc_Node); + + begin + if Present (Val.Base) then + return Static_Local_Access_Level (Val.Base) + Val.Offset; + else + return Val.Offset; + end if; + end Static_Type_Access_Level; + ----------------------- -- Type_Access_Level -- ----------------------- function Type_Access_Level (Typ : Entity_Id; - Allow_Alt_Model : Boolean := True; - Assoc_Ent : Entity_Id := Empty) return Uint + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True; + Assoc_Node : Node_Id := Empty) return Type_Level_T is Btyp : Entity_Id := Base_Type (Typ); Def_Ent : Entity_Id; begin + if Ekind (Typ) = E_Anonymous_Access_Type + and then not Is_Local_Anonymous_Access (Typ) + and then Nkind (Associated_Node_For_Itype (Typ)) = N_Object_Declaration + and then Deepest + + -- No_Dynamic_Accessibility_Checks override for alternative + -- accessibility model. + + and then not (Allow_Alt_Model + and then No_Dynamic_Accessibility_Checks_Enabled (Typ)) + then + -- Typ is the type of an Ada 2012 stand-alone object of an anonymous + -- access type. + + return + (Defining_Identifier (Associated_Node_For_Itype (Typ)), Uint_0); + -- Ada 2005 (AI-230): For most cases of anonymous access types, we -- simply use the level where the type is declared. This is true for -- stand-alone object declarations, and for anonymous access types @@ -2711,7 +3088,7 @@ package body Accessibility is -- the cases of access parameters, return objects of an anonymous access -- type, and, in Ada 95, access discriminants of limited types. - if Is_Access_Type (Btyp) then + elsif Is_Access_Type (Btyp) then if Ekind (Btyp) = E_Anonymous_Access_Type then -- No_Dynamic_Accessibility_Checks restriction override for -- alternative accessibility model. @@ -2727,16 +3104,18 @@ package body Accessibility is (Designated_Type (Btyp), Allow_Alt_Model); end if; - -- When an anonymous access type's Assoc_Ent is specified, + -- When an anonymous access type's Assoc_Node is specified, -- calculate the result based on the general accessibility -- level routine. -- We would like to use Associated_Node_For_Itype here instead, -- but in some cases it is not fine grained enough ??? - if Present (Assoc_Ent) then - return Static_Accessibility_Level - (Assoc_Ent, Object_Decl_Level); + if Present (Assoc_Node) then + return + (Empty, + Static_Accessibility_Level + (Assoc_Node, Object_Decl_Level => True)); end if; -- Otherwise take the context of the anonymous access type into @@ -2749,10 +3128,9 @@ package body Accessibility is (Associated_Node_For_Itype (Typ)); if Present (Def_Ent) then - -- When the defining entity is a subprogram then we know the - -- anonymous access type Typ has been generated to either - -- describe an anonymous access type formal or an anonymous - -- access result type. + -- When the defining entity is a subprogram, then we know + -- that the anonymous access type Typ has been generated + -- for either an access formal or an access result. -- Since we are only interested in the formal case, avoid -- the anonymous access result type. @@ -2762,20 +3140,23 @@ package body Accessibility is and then Etype (Def_Ent) = Typ) then -- When the type comes from an anonymous access - -- parameter, the level is that of the subprogram - -- declaration. + -- parameter, the level is that of the parameter + -- in the called subprogram. - return Scope_Depth (Def_Ent); + if In_Open_Scopes (Def_Ent) then + return (First_Formal (Def_Ent), Uint_0); + + -- The level is the deepest possible in the caller + + else + return (Empty, UI_From_Int (Int'Last)); + end if; -- When the type is an access discriminant, the level is -- that of the type. elsif Ekind (Def_Ent) = E_Discriminant then - return Scope_Depth - (if Present (Full_View (Scope (Def_Ent))) then - Full_View (Scope (Def_Ent)) - else - Scope (Def_Ent)); + return (Scope (Def_Ent), Uint_0); end if; end if; @@ -2785,7 +3166,7 @@ package body Accessibility is -- fail static accessibility checks. elsif not Is_Local_Anonymous_Access (Typ) then - return Scope_Depth (Standard_Standard); + return (Empty, Scope_Depth (Standard_Standard)); -- If this is a return object, the accessibility level is that of -- the result subtype of the enclosing function. The test here is @@ -2829,30 +3210,30 @@ package body Accessibility is and then Nkind (Associated_Node_For_Itype (Typ)) = N_Discriminant_Specification then - return Scope_Depth (Enclosing_Dynamic_Scope (Btyp)) + 1; + return (Btyp, Uint_1); end if; end if; -- Return library level for a generic formal type. This is done because - -- RM(10.3.2) says that "The statically deeper relationship does not - -- apply to ... a descendant of a generic formal type". Rather than + -- RM 3.10.2(19.4) says that "The statically deeper relationship does + -- not apply to ... a descendant of a generic formal type". Rather than -- checking at each point where a static accessibility check is -- performed to see if we are dealing with a formal type, this rule is - -- implemented by having Type_Access_Level and Deepest_Type_Access_Level - -- return extreme values for a formal type; Deepest_Type_Access_Level - -- returns Int'Last. By calling the appropriate function from among the - -- two, we ensure that the static accessibility check will pass if we - -- happen to run into a formal type. More specifically, we should call - -- Deepest_Type_Access_Level instead of Type_Access_Level whenever the - -- call occurs as part of a static accessibility check and the error - -- case is the case where the type's level is too shallow (as opposed - -- to too deep). + -- implemented by returning extreme values for a formal type depending + -- on the Deepest parameter. More specifically, Deepest should be passed + -- as True whenever the call occurs as part of a static accessibility + -- check and the error case is the case where the type's level is too + -- shallow (as opposed to too deep). if Is_Generic_Type (Root_Type (Btyp)) then - return Scope_Depth (Standard_Standard); + if Deepest then + return (Empty, UI_From_Int (Int'Last)); + else + return (Empty, Scope_Depth (Standard_Standard)); + end if; end if; - return Scope_Depth (Enclosing_Dynamic_Scope (Btyp)); + return (Btyp, Uint_0); end Type_Access_Level; end Accessibility; diff --git a/gcc/ada/accessibility.ads b/gcc/ada/accessibility.ads index 6790864d7d7b..67e1deb88698 100644 --- a/gcc/ada/accessibility.ads +++ b/gcc/ada/accessibility.ads @@ -23,7 +23,7 @@ -- -- ------------------------------------------------------------------------------ --- Accessibility level and check generation routines +-- Accessibility level calculation and check generation routines with Types; use Types; with Uintp; use Uintp; @@ -34,43 +34,6 @@ package Accessibility is -- Error, or warning within an instance, if the static accessibility -- rules of 3.10.2 are violated. - type Accessibility_Level_Kind is - (Dynamic_Level, Object_Decl_Level, Zero_On_Dynamic_Level); - -- Captures the different modes in which an accessibility level could be - -- obtained for a given expression. In the context of Accessibility_Level - -- function, Accessibility_Level_Kind signals what type of accessibility - -- level to obtain. - - -- When Level is Dynamic_Level, a defining identifier associated with an - -- access parameter, an access result, or an SAOOAAAT, may be returned, - -- and an N_Integer_Literal node in the other cases. - - -- When Level is Object_Decl_Level, an N_Integer_Literal node whose value - -- is the level of the declaration of the object is returned in the cases - -- where Dynamic_Level returns a defining identifier; in the other cases, - -- the same N_Integer_Literal node as Dynamic_Level is returned. - - -- When Level is Zero_On_Dynamic_Level, an N_Integer_Literal node whose - -- value is zero (i.e. that of the library level) is returned in the cases - -- where Dynamic_Level returns a defining identifier; in the other cases, - -- the same N_Integer_Literal node as Dynamic_Level is returned. - - function Accessibility_Level - (Expr : Node_Id; - Level : Accessibility_Level_Kind; - In_Return_Context : Boolean := False; - Allow_Alt_Model : Boolean := True) return Node_Id; - -- Centralized accessibility level calculation routine for finding the - -- accessibility level of a given expression Expr. - - -- In_Return_Context forces the Accessibility_Level calculations to be - -- carried out "as if" Expr existed in a return value. This is useful for - -- calculating the accessibility levels for discriminant associations - -- and return aggregates. - - -- The Allow_Alt_Model parameter allows the alternative level calculation - -- under the restriction No_Dynamic_Accessibility_Checks to be performed. - procedure Apply_Accessibility_Check_For_Class_Wide_Allocator (N : Node_Id; Exp : Node_Id; @@ -130,17 +93,44 @@ package Accessibility is -- Apply legality rules of 6.5(5.9) and 6.8(5) to the access discriminants -- of an identifier or aggregate in a return statement. - function Deepest_Type_Access_Level + function Dynamic_Accessibility_Level + (Expr : Node_Id; + In_Return_Context : Boolean := False; + Allow_Alt_Model : Boolean := True) return Node_Id; + -- Return the dynamic accessibility level of a given expression Expr, i.e. + -- the accessibility level that is defined by the language in RM 3.10.2(3) + -- as a value "reflect[ing] the run-time nesting of masters". + + -- In_Return_Context forces the level calculation to be carried out as if + -- Expr was an operative constituent of a return value; when it is False, + -- the function computes whether that is the case or not. + + -- The Allow_Alt_Model parameter allows the alternative level calculation + -- under the restriction No_Dynamic_Accessibility_Checks to be performed. + + function Dynamic_Local_Access_Level (E : Entity_Id) return Node_Id; + -- Return the dynamic accessibility level of the declaration of E. This is + -- the scope depth of the enclosing dynamic scope of E, offsetted by the + -- extra accessibility level of the enclosing subprogram of E if it exists. + + function Dynamic_Subprogram_Access_Level (Subp : Entity_Id) return Node_Id; + -- Return the dynamic accessibility level of Subp, which is the level of + -- the innermost master of the declaration of Subp (modulo renaming) and, + -- in particular, is *not* the level of the entities declared within Subp. + -- It is used to enforce the accessibility rules for access-to-subprogram + -- types, results of function calls, and formal objects of generic units. + + function Dynamic_Type_Access_Level (Typ : Entity_Id; - Allow_Alt_Model : Boolean := True) return Uint; - -- Same as Type_Access_Level, except that if the type is the type of an Ada - -- 2012 stand-alone object of an anonymous access type, then return the - -- static accessibility level of the object. In that case, the dynamic - -- accessibility level of the object may take on values in a range. The low - -- bound of that range is returned by Type_Access_Level; this function - -- yields the high bound of that range. Also differs from Type_Access_Level - -- in the case of a descendant of a generic formal type (returns Int'Last - -- instead of 0). + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True) return Node_Id; + -- Return the dynamic accessibility level of Typ + + -- When Deepest is True, and Typ is that of an Ada 2012 stand-alone object + -- of an anonymous access type, then return the dynamic accessibility level + -- of the declaration of the object instead of the library level; moreover, + -- in the case of a descendant of a generic formal type, return Int'Last + -- instead of the library level. -- The Allow_Alt_Model parameter allows the alternative level calculation -- under the restriction No_Dynamic_Accessibility_Checks to be performed. @@ -149,10 +139,6 @@ package Accessibility is -- Same as Extra_Accessibility_Of_Object in Einfo, but looks through object -- renamings per the RM 3.10.2(8) rule. - function Get_Dynamic_Accessibility (E : Entity_Id) return Entity_Id; - -- Obtain the accessibility level for a given entity formal taking into - -- account both extra and minimum accessibility. - function Has_Access_Values (T : Entity_Id) return Boolean; -- Returns true if the underlying type of T is an access type, or has a -- component (at any recursive level) that is an access type. This is a @@ -170,14 +156,6 @@ package Accessibility is -- Returns True if the given subtype is unconstrained and has one or more -- access discriminants. - function Needs_Accessibility_Level_Temp_Or_Check - (Conditional_Expr : Node_Id) return Boolean; - -- Determine whether a conditional expression occurs in a context that - -- requires either an associated accessibility-level-valued temp (which - -- is assigned to in each arm of the conditional expression) or an - -- accessibility level check (which is pushed down into each arm of the - -- conditional expression). - function Needs_Result_Accessibility_Level (Func_Id : Entity_Id) return Boolean; -- Ada 2012 (AI05-0234): Return True if the function needs an implicit @@ -194,38 +172,53 @@ package Accessibility is -- of a value conversion is guaranteed to not create a new object, -- accessibility rules are defined as if it might. - subtype Static_Accessibility_Level_Kind - is Accessibility_Level_Kind range Object_Decl_Level - .. Zero_On_Dynamic_Level; - -- Restrict the reange of Accessibility_Level_Kind to be non-dynamic for - -- use in the static version of Accessibility_Level below. - function Static_Accessibility_Level (Expr : Node_Id; - Level : Static_Accessibility_Level_Kind; + Object_Decl_Level : Boolean := False; In_Return_Context : Boolean := False) return Uint; - -- Overloaded version of Accessibility_Level which returns a universal - -- integer for use in compile-time checking. Note: Level is restricted to - -- be non-dynamic. - - function Subprogram_Access_Level (Subp : Entity_Id) return Uint; - -- Return the accessibility level of Subp. Note that this is the level of + -- Return the static accessibility level of a given expression Expr, i.e. + -- an integer reflecting the compile-time nesting of master constructs, + -- for use in static accessibility checks. + + -- If Object_Decl_Level is True, then return the static accessibility level + -- of the *declaration* of the object in the cases where that of the object + -- itself is not defined, i.e. access parameters and Ada 2012's stand-alone + -- objects of an anonymous access type (RM 3.10.2(19.1-2)). If it is False, + -- then return the library level in these cases. + + -- In_Return_Context forces the level calculation to be carried out as if + -- Expr was an operative constituent of a return value; when it is False, + -- the function computes whether that is the case or not. + + function Static_Local_Access_Level (E : Entity_Id) return Uint; + -- Return the static accessibility level of the declaration of E. This is + -- the scope depth of the enclosing dynamic scope of E. + + function Static_Subprogram_Access_Level (Subp : Entity_Id) return Uint; + -- Return the static accessibility level of Subp, which is the level of -- the innermost master of the declaration of Subp (modulo renaming) and, -- in particular, is *not* the level of the entities declared within Subp. -- It is used to enforce the accessibility rules for access-to-subprogram -- types, results of function calls, and formal objects of generic units. - function Type_Access_Level + function Static_Type_Access_Level (Typ : Entity_Id; - Allow_Alt_Model : Boolean := True; - Assoc_Ent : Entity_Id := Empty) return Uint; - -- Return the accessibility level of Typ + Deepest : Boolean := False; + Allow_Alt_Model : Boolean := True; + Assoc_Node : Node_Id := Empty) return Uint; + -- Return the static accessibility level of Typ + + -- When Deepest is True, and Typ is that of an Ada 2012 stand-alone object + -- of an anonymous access type, then return the static accessibility level + -- of the declaration of the object instead of the library level; moreover, + -- in the case of a descendant of a generic formal type, return Int'Last + -- instead of the library level. -- The Allow_Alt_Model parameter allows the alternative level calculation -- under the restriction No_Dynamic_Accessibility_Checks to be performed. - -- Assoc_Ent allows for the optional specification of the entity associated - -- with Typ. This gets utilized mostly for anonymous access type - -- processing, where context matters in interpreting Typ's level. + -- Assoc_Node allows for the optional specification of a node associated + -- with Typ. This is used only for anonymous access types where the context + -- matters in interpreting Typ's level. end Accessibility; diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 8e6fba46b82e..6f25f23f99a3 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -1551,8 +1551,9 @@ package body Checks is end if; -- If an assignment target is present, then we need to generate the - -- actual subtype if the target is a parameter or aliased object with - -- an unconstrained nominal subtype. + -- actual subtype if the target is a parameter, or a view conversion + -- of a constrained object, or an aliased object with unconstrained + -- nominal subtype. -- Ada 2005 (AI-363): For Ada 2005, we limit the building of the actual -- subtype to the parameter and dereference cases, since other aliased @@ -1561,6 +1562,10 @@ package body Checks is if Present (Lhs) and then (Present (Param_Entity (Lhs)) + or else (not Is_Constrained (T_Typ) + and then Is_View_Conversion (Lhs) + and then + Is_Constrained (Etype (Expression (Lhs)))) or else (Ada_Version < Ada_2005 and then not Is_Constrained (T_Typ) and then Is_Aliased_View (Lhs) diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb index 99ad2cd5d567..fb781fd6ac33 100644 --- a/gcc/ada/contracts.adb +++ b/gcc/ada/contracts.adb @@ -755,7 +755,7 @@ package body Contracts is if Freeze_Types and then Present (Corresponding_Aspect (Prag)) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => Bod, Expr => Expression @@ -1530,9 +1530,10 @@ package body Contracts is Body_Decl : constant Entity_Id := Unit_Declaration_Node (Body_Id); Loc : constant Source_Ptr := Sloc (Body_Decl); Spec_Id : constant Entity_Id := Corresponding_Spec (Body_Decl); - Subp_Id : Entity_Id; - Ret_Type : Entity_Id; + Extra_Decl : Node_Id; + Ret_Type : Entity_Id; + Subp_Id : Entity_Id; Wrapper_Id : Entity_Id; Wrapper_Body : Node_Id; Wrapper_Spec : Node_Id; @@ -1619,6 +1620,16 @@ package body Contracts is Result_Definition => New_Occurrence_Of (Ret_Type, Loc)); end if; + -- Do not move the declaration of the Extra_Accessibility_Of_Subprogram + -- constant, if any, since it really belongs in the original subprogram. + + if Present (Extra_Accessibility_Of_Subprogram (Subp_Id)) then + Extra_Decl := + Declaration_Node (Extra_Accessibility_Of_Subprogram (Subp_Id)); + Remove (Extra_Decl); + Prepend_To (Decls, Extra_Decl); + end if; + -- Create the wrapper body using Body_Id's statements and declarations Wrapper_Body := @@ -3108,7 +3119,7 @@ package body Contracts is if Freeze_T and then Present (Corresponding_Aspect (Prag)) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => Body_Decl, Expr => Expression diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads index ea5631094186..c69aec8baf7f 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -650,9 +650,9 @@ package Einfo is -- the corresponding implicitly declared class-wide type. For a -- class-wide type, returns itself. Set to Empty for untagged types. --- Class_Wide_Equivalent_Type --- Defined in all type entities. Used to store an internally generated --- class-wide equivalent type for an associated mutably tagged type. +-- Class_Wide_Equivalent_Type [base type only] +-- Defined in class-wide types. Used to store an internally generated +-- class-wide equivalent type for a mutably tagged type. -- Cloned_Subtype -- Defined in E_Record_Subtype and E_Class_Wide_Subtype entities. @@ -1280,6 +1280,18 @@ package Einfo is -- and the Extra_Accessibility_Of_Result field of the function points to -- the entity for this extra formal. +-- Extra_Accessibility_Of_Subprogram +-- Defined in (non-generic) subprograms. Normally Empty, but if expansion +-- is active, and the subprogram has either at least one formal parameter +-- with Extra_Accessibility_Of_Object, or Extra_Accessibility_Of_Result, +-- or its parent subprogram has Extra_Accessibility_Of_Subprogram, then +-- a local constant of type Natural is created in the subprogram, whose +-- initialization expression is the maximum of all the values mentioned +-- above, and the Extra_Accessibility_Of_Subprogram points to the entity. +-- It is used to offset the static nesting depth of the local entities, +-- both objects, subprograms, and types declared in the subprogram, for +-- the computation of the dynamic accessibility level of these entities. + -- Extra_Constrained -- Defined in formal parameters in the non-generic case. Normally Empty, -- but if expansion is active and a parameter is one for which a dynamic @@ -2591,17 +2603,16 @@ package Einfo is -- that the constructed subtype itself will be constrained. -- Is_Controlled_Active [base type only] --- Defined in all type entities. Indicates that the type is controlled, --- i.e. has been declared with the Finalizable or the Destructor aspect --- or has inherited the aspect from an ancestor. Can only be set for --- record types, tagged or untagged. --- System.Finalization_Root.Root_Controlled is an example of the former --- case while Ada.Finalization.Controlled and +-- Defined in all types. Set only for record types, tagged or untagged. +-- Indicates that the type is controlled, i.e. has been declared with +-- the Finalizable or the Destructor aspect, or has inherited one of the +-- aspects from an ancestor. System.Finalization_Root.Root_Controlled is +-- an example of the former case, while Ada.Finalization.Controlled and -- Ada.Finalization.Limited_Controlled are examples of the latter. -- Is_Controlled (synth) [base type only] --- Defined in all type entities. Set if Is_Controlled_Active is set for --- the type, and Disable_Controlled is not set. +-- Defined in all type entities. Set if both Is_Controlled_Active is set +-- and Disable_Controlled is not set for the type. -- Is_Controlling_Formal -- Defined in all Formal_Kind entities. Marks the controlling parameters @@ -3105,8 +3116,8 @@ package Einfo is -- Is_Modular_Integer_Type (synthesized) -- Applies to all entities. True if entity is a modular integer type --- Is_Mutably_Tagged_Type --- Defined in all type entities. Used to signify that a given type is a +-- Is_Mutably_Tagged_Type [base type only] +-- Defined in all types and subtypes. Set to indicate that the type is a -- "mutably tagged" class-wide type where 'Size'Class has been specified. -- Is_Non_Static_Subtype @@ -3725,14 +3736,6 @@ package Einfo is -- is also set (to the default value of zero = Default_Mechanism) in a -- subprogram body entity but not used in this context. --- Minimum_Accessibility --- Defined in formal parameters in the non-generic case. Normally Empty, --- but if expansion is active, and a parameter exists for which a --- dynamic accessibility check is required, then an object is generated --- within such a subprogram representing the accessibility level of the --- subprogram or the formal's Extra_Accessibility - whichever one is --- lesser. The Minimum_Accessibility field then points to this object. - -- Modulus [implementation base type only] -- Defined in modular types. Contains the modulus. For the binary case, -- this will be a power of 2, but if Non_Binary_Modulus is set, then it @@ -5169,6 +5172,7 @@ package Einfo is -- Is_Frozen -- Is_Generic_Actual_Type -- Is_Independent + -- Is_Mutably_Tagged_Type (base type only) -- Is_Non_Static_Subtype -- Is_Packed (base type only) -- Is_Private_Composite @@ -5350,6 +5354,7 @@ package Einfo is -- Direct_Primitive_Operations -- Cloned_Subtype (subtype case only) -- First_Entity + -- Class_Wide_Equivalent_Type (base type only) -- Equivalent_Type (always Empty for type) -- Non_Limited_View -- Last_Entity @@ -5611,7 +5616,6 @@ package Einfo is -- Alias (non-generic case only) -- Renamed_Entity -- Renamed_Object $$$ - -- Extra_Accessibility_Of_Result (non-generic case only) -- Last_Entity -- Interface_Name -- Scope_Depth_Value @@ -5625,6 +5629,8 @@ package Einfo is -- Overridden_Inherited_Operation -- Overridden_Operation -- Wrapped_Entity (non-generic case only) + -- Extra_Accessibility_Of_Result (non-generic case only) + -- Extra_Accessibility_Of_Subprogram (non-generic case only) -- Extra_Formals -- Extra_Formals_Known (non-generic case only) -- Anonymous_Collections (non-generic case only) @@ -5760,7 +5766,6 @@ package Einfo is -- Default_Value -- Protected_Formal -- Extra_Constrained - -- Minimum_Accessibility -- Last_Assignment (OUT, IN-OUT only) -- Activation_Record_Component -- Has_Initial_Value @@ -5829,13 +5834,14 @@ package Einfo is -- E_Operator -- First_Entity -- Alias - -- Extra_Accessibility_Of_Result -- Last_Entity -- Subps_Index -- Overridden_Inherited_Operation -- Overridden_Operation -- Linker_Section_Pragma -- Contract + -- Extra_Accessibility_Of_Result + -- Extra_Accessibility_Of_Subprogram -- Extra_Formals -- Extra_Formals_Known -- Import_Pragma @@ -5992,6 +5998,7 @@ package Einfo is -- Overridden_Inherited_Operation -- Overridden_Operation (never for init proc) -- Wrapped_Entity (non-generic case only) + -- Extra_Accessibility_Of_Subprogram (non-generic case only) -- Extra_Formals -- Extra_Formals_Known (non-generic case only) -- Anonymous_Collections (non-generic case only) diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 7f785c329075..da302cb048c1 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -23,6 +23,7 @@ -- -- ------------------------------------------------------------------------------ +with Accessibility; use Accessibility; with Aspects; use Aspects; with Atree; use Atree; with Checks; use Checks; @@ -4059,19 +4060,6 @@ package body Exp_Aggr is function Check_Component (C : Node_Id; T_OK : Boolean) return Boolean is - - function SDO (E : Entity_Id) return Uint; - -- Return the Scope Depth Of the enclosing dynamic scope of E - - --------- - -- SDO -- - --------- - - function SDO (E : Entity_Id) return Uint is - begin - return Scope_Depth (Enclosing_Dynamic_Scope (E)); - end SDO; - -- Start of processing for Check_Component begin @@ -4149,7 +4137,9 @@ package body Exp_Aggr is else return Present (Target_Object) and then not Is_Formal (Target_Object) - and then SDO (Target_Object) >= SDO (Entity (C)); + and then + Static_Local_Access_Level (Target_Object) + >= Static_Local_Access_Level (Entity (C)); end if; -- For a renamed object, recurse @@ -4175,7 +4165,9 @@ package body Exp_Aggr is -- is at most as deeply nested as the component. elsif Is_Formal (Target_Object) then - return SDO (Target_Object) <= SDO (Entity (C)); + return + Static_Local_Access_Level (Target_Object) + <= Static_Local_Access_Level (Entity (C)); -- For distinct stand-alone objects, this is safe diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 6ed2de30cb8f..6bc1cfbb4f3d 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -2613,9 +2613,7 @@ package body Exp_Attr is Name_Req => True)), Attribute_Name => Name_Tag)), - Right_Opnd => - Make_Integer_Literal (Loc, - Type_Access_Level (P_Type))), + Right_Opnd => Dynamic_Type_Access_Level (P_Type)), Then_Statements => New_List (Make_Raise_Statement (Loc, @@ -8419,7 +8417,7 @@ package body Exp_Attr is begin Find_Fat_Info (PBtyp, Ftp, Pkg); - -- If the prefix is a reverse SSO component, or is possibly + -- If the prefix is a reverse SSO object, or is possibly -- unaligned, first create a temporary copy that is in -- native SSO, and properly aligned. Make it Volatile to -- prevent folding in the back-end. Note that we use an @@ -8428,7 +8426,7 @@ package body Exp_Attr is -- that case it cannot be copied using a floating point -- register. - if In_Reverse_Storage_Order_Object (Pref) + if Is_Reverse_Storage_Order_Object (Pref) or else Is_Possibly_Unaligned_Object (Pref) then declare diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 3b823b6fa411..5f4a271d627e 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -2789,7 +2789,7 @@ package body Exp_Ch3 is Selector_Name => Make_Identifier (Loc, Name_uInit_Level), Explicit_Actual_Parameter => - Accessibility_Level (Id_Ref, Dynamic_Level))); + Dynamic_Accessibility_Level (Id_Ref))); end if; Append_To (Res, @@ -3352,7 +3352,10 @@ package body Exp_Ch3 is -- Create an extra accessibility parameter to capture the level of -- the object being initialized when its type is a limited record. - if Is_Limited_Record (Rec_Type) then + if Is_Limited_Record (Rec_Type) + and then not Is_RTE (Rec_Type, RE_Activation_Chain) + and then not Is_RTE (Rec_Type, RE_Finalization_Master) + then Append_To (Parameters, Make_Parameter_Specification (Loc, Defining_Identifier => Make_Defining_Identifier @@ -6456,6 +6459,17 @@ package body Exp_Ch3 is Set_CPP_Constructors (Typ); else + -- If the type is derived from an untagged private type whose + -- full view is tagged, the type is marked tagged for layout + -- reasons, but it has no dispatch table. + + if Is_Derived_Type (Typ) + and then not Is_Tagged_Type (Etype (Typ)) + then + pragma Assert (Is_Private_Type (Etype (Typ))); + return; + end if; + if not Building_Static_DT (Typ) then -- Usually inherited primitives are not delayed but the first @@ -6548,17 +6562,6 @@ package body Exp_Ch3 is Set_Is_Frozen (Typ); - -- If the type is derived from an untagged private type whose - -- full view is tagged, the type is marked tagged for layout - -- reasons, but it has no dispatch table. - - if Is_Derived_Type (Typ) - and then not Is_Tagged_Type (Etype (Typ)) - then - pragma Assert (Is_Private_Type (Etype (Typ))); - return; - end if; - Set_All_DT_Position (Typ); -- Create and decorate the tags. Suppress their creation when @@ -6991,8 +6994,7 @@ package body Exp_Ch3 is if Ekind (Etype (Comp)) /= E_Void and then Is_Mutably_Tagged_Type (Etype (Comp)) then - Set_Etype - (Comp, Class_Wide_Equivalent_Type (Etype (Comp))); + Set_Etype (Comp, Class_Wide_Equivalent_Type (Etype (Comp))); end if; Next_Entity (Comp); end loop; @@ -8669,6 +8671,28 @@ package body Exp_Ch3 is and then OK_To_Rename_Ref (Prefix (Expr_Q)) and then not Special_Ret_Obj)); + -- If the object is of a mutably tagged type and is initialized + -- by something other than a function call, do the initialization + -- as an assignment so that only the bits present in the initial + -- value are copied. + + if Is_Mutably_Tagged_CW_Equivalent_Type (Typ) + and then Nkind (Expr_Q) /= N_Function_Call + and then not Rewrite_As_Renaming + then + declare + Stat : constant Node_Id := + Make_Assignment_Statement (Loc, + Name => New_Occurrence_Of (Def_Id, Loc), + Expression => Relocate_Node (Expr)); + begin + Set_Assignment_OK (Name (Stat)); + Set_No_Finalize_Actions (Stat); + Insert_Action_After (Init_After, Stat); + Set_Expression (N, Empty); + Set_No_Initialization (N); + end; + -- If the type needs finalization and is not inherently limited, -- then the target is adjusted after the copy and attached to the -- finalization list. However, no adjustment is needed in the case @@ -8680,7 +8704,7 @@ package body Exp_Ch3 is -- Similarly, no adjustment is needed if we are going to rewrite -- the object declaration into a renaming declaration. - if Needs_Finalization (Typ) + elsif Needs_Finalization (Typ) and then not Is_Inherently_Limited_Type (Typ) and then Nkind (Expr_Q) /= N_Function_Call and then not Is_Two_Pass_Aggregate (Expr_Q) @@ -8753,7 +8777,7 @@ package body Exp_Ch3 is -- General case else - Level_Expr := Accessibility_Level (Expr, Dynamic_Level); + Level_Expr := Dynamic_Accessibility_Level (Expr); end if; Level_Decl := @@ -10062,8 +10086,9 @@ package body Exp_Ch3 is if Is_Part_Of_Formal or else Is_Part_Of_Dereference or else - Type_Access_Level (Def_Id) - > Static_Accessibility_Level (Pool, Object_Decl_Level) + Static_Type_Access_Level (Def_Id) + > Static_Accessibility_Level + (Pool, Object_Decl_Level => True) then -- Generate: -- if RSP'Class?(Def_Id) in RSPWS'Class then @@ -12326,7 +12351,7 @@ package body Exp_Ch3 is -- Set to True if Tag_Typ has a primitive that renames the predefined -- equality operator. Used to implement (RM 8-5-4(8)). - -- Start of processing for Make_Predefined_Primitive_Specs + -- Start of processing for Make_Predefined_Primitive_Eq_Spec begin Renamed_Eq := Empty; diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 8fa214f01853..913853947543 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -197,6 +197,10 @@ package body Exp_Ch4 is -- associated storage pool is derived from Checked_Pool, generate a -- call to the 'Dereference' primitive operation. + function Is_Copy_Type (Typ : Entity_Id) return Boolean; + -- Return True if we can copy objects of this type when expanding an EWA + -- or a conditional expression. + function Make_Array_Comparison_Op (Typ : Entity_Id; Nod : Node_Id) return Node_Id; @@ -5141,21 +5145,6 @@ package body Exp_Ch4 is Scop : constant Entity_Id := Current_Scope; Typ : constant Entity_Id := Etype (N); - function Is_Copy_Type (Typ : Entity_Id) return Boolean; - -- Return True if we can copy objects of this type when expanding a case - -- expression. - - ------------------ - -- Is_Copy_Type -- - ------------------ - - function Is_Copy_Type (Typ : Entity_Id) return Boolean is - begin - return Is_Elementary_Type (Underlying_Type (Typ)); - end Is_Copy_Type; - - -- Local variables - Acts : List_Id; Alt : Node_Id; Case_Stmt : Node_Id; @@ -5597,37 +5586,6 @@ package body Exp_Ch4 is Loc : constant Source_Ptr := Sloc (N); Typ : constant Entity_Id := Etype (N); - function Is_Copy_Type (Typ : Entity_Id) return Boolean; - -- Return True if we can copy objects of this type when expanding the - -- node. The function must return False for limited types for semantic - -- reasons, and more generally should do so for all by-reference types. - -- Of course the run-time performance of the copy operation should also - -- be taken into account, but the expansion of conditional expressions - -- may choose to create EWA nodes instead of conditional statements to - -- deal with the actions, in which case these EWA nodes also need to be - -- preserved for semantic reasons. In practice, this means that the - -- subset of types accepted by this Is_Copy_Type predicate must contain - -- the union of the subsets of types accepted by its homonyms in the - -- Expand_N_Case_Expression and Expand_N_If_Expression procedures, in - -- other words must return True when at least one of them returns true. - -- This implementation is that of Expand_N_If_Expression.Is_Copy_Type, - -- which already accepts a superset of the types accepted by its twin - -- Expand_N_Case_Expression.Is_Copy_Type predicate. - - ------------------ - -- Is_Copy_Type -- - ------------------ - - function Is_Copy_Type (Typ : Entity_Id) return Boolean is - Utyp : constant Entity_Id := Underlying_Type (Typ); - - begin - return Is_Definite_Subtype (Utyp) - and then not Is_By_Reference_Type (Utyp); - end Is_Copy_Type; - - -- Local variables - Temp_Decl : Node_Id; Temp_Id : Entity_Id; Temp_Ref : Node_Id; @@ -5742,8 +5700,6 @@ package body Exp_Ch4 is -- Expand_N_If_Expression -- ---------------------------- - -- Deal with limited types and condition actions - procedure Expand_N_If_Expression (N : Node_Id) is Cond : constant Node_Id := First (Expressions (N)); Loc : constant Source_Ptr := Sloc (N); @@ -5752,38 +5708,11 @@ package body Exp_Ch4 is Par : constant Node_Id := Parent (N); Typ : constant Entity_Id := Etype (N); - Force_Expand : constant Boolean - := Needs_Accessibility_Level_Temp_Or_Check (N); - -- Determine if we are dealing with a special case of a conditional - -- expression used as an actual for an anonymous access type which - -- forces us to transform the if expression into an expression with - -- actions in order to create a temporary to capture the level of the - -- expression in each branch. Also True if the conditional - -- expression is the RHS of an assignment to a saooaaat (so the - -- accessibility level temp associated with the saooaaat also needs - -- to be updated as part of the assignment). - - function Is_Copy_Type (Typ : Entity_Id) return Boolean; - -- Return True if we can copy objects of this type when expanding an if - -- expression. - function OK_For_Single_Subtype (T1, T2 : Entity_Id) return Boolean; -- Return true if it is acceptable to use a single subtype for two -- dependent expressions of subtype T1 and T2 respectively, which are -- unidimensional arrays whose index bounds are known at compile time. - ------------------ - -- Is_Copy_Type -- - ------------------ - - function Is_Copy_Type (Typ : Entity_Id) return Boolean is - Utyp : constant Entity_Id := Underlying_Type (Typ); - - begin - return Is_Definite_Subtype (Utyp) - and then not Is_By_Reference_Type (Utyp); - end Is_Copy_Type; - --------------------------- -- OK_For_Single_Subtype -- --------------------------- @@ -6486,16 +6415,9 @@ package body Exp_Ch4 is Prefix => New_Occurrence_Of (Target, Loc)); end; - -- For other types, we only need to expand if there are other actions - -- associated with either branch or we need to force expansion to deal - -- with if expressions used as an actual of an anonymous access type. - - elsif Present (Then_Actions (N)) - or else Present (Else_Actions (N)) - or else Force_Expand - then - -- We now wrap the actions into the appropriate expression + -- For other types, we just wrap the actions into an EWA node, if any + elsif Present (Then_Actions (N)) or else Present (Else_Actions (N)) then -- We do not need to call Process_Transients_In_Expression on -- the list of actions in this case, because the expansion of -- Expression_With_Actions will do it. @@ -6520,62 +6442,6 @@ package body Exp_Ch4 is Analyze_And_Resolve (Elsex, Typ); end if; - -- We must force expansion into an expression with actions when - -- an if expression gets used directly as an actual for an - -- anonymous access type. - - if Force_Expand then - declare - Cnn : constant Entity_Id := Make_Temporary (Loc, 'C'); - Acts : List_Id; - begin - Acts := New_List; - - -- Generate: - -- Cnn : Ann; - - Decl := - Make_Object_Declaration (Loc, - Defining_Identifier => Cnn, - Object_Definition => New_Occurrence_Of (Typ, Loc)); - Append_To (Acts, Decl); - - Set_No_Initialization (Decl); - - -- Generate: - -- if Cond then - -- Cnn := ; - -- else - -- Cnn := ; - -- end if; - - If_Stmt := - Make_Implicit_If_Statement (N, - Condition => Relocate_Node (Cond), - Then_Statements => New_List ( - Make_Assignment_Statement (Sloc (Thenx), - Name => New_Occurrence_Of (Cnn, Sloc (Thenx)), - Expression => Relocate_Node (Thenx))), - - Else_Statements => New_List ( - Make_Assignment_Statement (Sloc (Elsex), - Name => New_Occurrence_Of (Cnn, Sloc (Elsex)), - Expression => Relocate_Node (Elsex)))); - Append_To (Acts, If_Stmt); - - -- Generate: - -- do - -- ... - -- in Cnn end; - - Rewrite (N, - Make_Expression_With_Actions (Loc, - Expression => New_Occurrence_Of (Cnn, Loc), - Actions => Acts)); - Analyze_And_Resolve (N, Typ); - end; - end if; - return; -- For the sake of GNATcoverage, generate an intermediate temporary in @@ -6625,11 +6491,11 @@ package body Exp_Ch4 is return; end if; - -- Fall through here for either the limited expansion, or the case of - -- inserting actions for nonlimited types. In both these cases, we must - -- move the SLOC of the parent If statement to the newly created one and - -- change it to the SLOC of the expression which, after expansion, will - -- correspond to what is being evaluated. + -- Fall through here when the if_expression is to be replaced with an + -- if_statement. If the parent itself is an if_statement, we move the + -- SLOC of the parent to the newly created one, and replace it by the + -- SLOC of the expression which, after expansion, will correspond to + -- what is being evaluated. if Present (Par) and then Nkind (Par) = N_If_Statement then Set_Sloc (If_Stmt, Sloc (Par)); @@ -6646,7 +6512,7 @@ package body Exp_Ch4 is Prepend_List (Else_Actions (N), Else_Statements (If_Stmt)); end if; - -- Rewrite the parent statement as an if statement + -- Rewrite the parent statement as an if statement in specific cases if Optimize_Assignment_Stmt or else Optimize_Return_Stmt then Rewrite (Par, If_Stmt); @@ -7211,9 +7077,9 @@ package body Exp_Ch4 is and then Ekind (Ltyp) = E_Anonymous_Access_Type then declare - New_N : Node_Id; - Param_Level : Node_Id; - Type_Level : Node_Id; + New_N : Node_Id; + Expr_Level : Node_Id; + Type_Level : Node_Id; begin -- When restriction No_Dynamic_Accessibility_Checks is in @@ -7224,9 +7090,9 @@ package body Exp_Ch4 is Rewrite (N, New_Occurrence_Of (Boolean_Literals - (Static_Accessibility_Level - (Lop, Object_Decl_Level) <= - Type_Access_Level (Rtyp)), + (Static_Accessibility_Level + (Lop, Object_Decl_Level => True) + <= Static_Type_Access_Level (Rtyp)), Loc)); Analyze_And_Resolve (N, Restyp); @@ -7239,28 +7105,23 @@ package body Exp_Ch4 is Rewrite (N, New_Occurrence_Of (Standard_False, Loc)); Analyze_And_Resolve (N, Restyp); - -- Apply an accessibility check if the access object has an - -- associated access level and when the level of the type is - -- less deep than the level of the access parameter. This - -- can only occur for access parameters and stand-alone - -- objects of an anonymous access type. + -- Otherwise perform a dynamic accessibility test else - Param_Level := Accessibility_Level (Lop, Dynamic_Level); - - Type_Level := - Make_Integer_Literal (Loc, Type_Access_Level (Rtyp)); + Expr_Level := Dynamic_Accessibility_Level (Lop); + Type_Level := Dynamic_Type_Access_Level (Rtyp); -- Return True only if the accessibility level of the -- expression entity is not deeper than the level of - -- the tested access type. + -- the tested access type (RM 4.5.2(30.3)). Rewrite (N, Make_And_Then (Loc, Left_Opnd => Relocate_Node (N), - Right_Opnd => Make_Op_Le (Loc, - Left_Opnd => Param_Level, - Right_Opnd => Type_Level))); + Right_Opnd => + Make_Op_Le (Loc, + Left_Opnd => Expr_Level, + Right_Opnd => Type_Level))); Analyze_And_Resolve (N); @@ -13846,6 +13707,44 @@ package body Exp_Ch4 is N_Op_Minus | N_Op_Multiply | N_Op_Subtract; end Integer_Promotion_Possible; + ------------------ + -- Is_Copy_Type -- + ------------------ + + function Is_Copy_Type (Typ : Entity_Id) return Boolean is + begin + -- Objects of a by-copy type can always be copied + + if Is_By_Copy_Type (Typ) then + return True; + + -- Objects of a by-reference type can never be (easily) copied + + elsif Is_By_Reference_Type (Typ) then + return False; + + -- For other objects, we consider that we can copy them if they + -- are small enough, the main case being small arrays of scalars. + + else + declare + Utyp : constant Entity_Id := Underlying_Type (Typ); + + begin + -- If the Object_Size is not set in the source code, then it + -- cannot be much larger than the Value_Size in the end. + + if Known_Esize (Utyp) then + return Esize (Utyp) <= System_Max_Integer_Size; + elsif Known_RM_Size (Utyp) then + return RM_Size (Utyp) <= System_Max_Integer_Size; + else + return False; + end if; + end; + end if; + end Is_Copy_Type; + ------------------------------ -- Make_Array_Comparison_Op -- ------------------------------ diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 5d7c78f82f67..63c6cb9798ac 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -2480,7 +2480,7 @@ package body Exp_Ch5 is begin -- Handle chains of renamings - Ent := Name (N); + Ent := Lhs; while Nkind (Ent) in N_Has_Entity and then Present (Entity (Ent)) and then Is_Object (Entity (Ent)) @@ -2868,7 +2868,7 @@ package body Exp_Ch5 is -- when the Lhs denotes a container cursor and the Next function employs -- an access type, because this can never result in a dangling pointer. - if Is_Access_Type (Typ) + if Ekind (Typ) = E_Anonymous_Access_Type and then Is_Entity_Name (Lhs) and then Ekind (Entity (Lhs)) /= E_Loop_Parameter and then Present (Extra_Accessibility (Entity (Lhs))) @@ -2879,9 +2879,9 @@ package body Exp_Ch5 is Condition => Make_Op_Gt (Loc, Left_Opnd => - Accessibility_Level (Rhs, Dynamic_Level), + Dynamic_Accessibility_Level (Rhs), Right_Opnd => - Accessibility_Level (Lhs, Object_Decl_Level)), + Dynamic_Type_Access_Level (Typ, Deepest => True)), Reason => PE_Accessibility_Check_Failed)); end if; @@ -2890,10 +2890,7 @@ package body Exp_Ch5 is Name => New_Occurrence_Of (Extra_Accessibility (Entity (Lhs)), Loc), Expression => - Accessibility_Level - (Expr => Rhs, - Level => Dynamic_Level, - Allow_Alt_Model => False))); + Dynamic_Accessibility_Level (Rhs, Allow_Alt_Model => False))); end if; -- Case of assignment to a bit packed array element. If there is a @@ -2970,18 +2967,18 @@ package body Exp_Ch5 is -- If dispatching assignment, we need to dispatch to _assign - if Is_Class_Wide_Type (Typ) + if (Is_Class_Wide_Type (Typ) and then Expand_Ctrl_Actions) -- If the type is tagged, we may as well use the predefined -- primitive assignment. This avoids inlining a lot of code -- and in the class-wide case, the assignment is replaced -- by a dispatching call to _assign. It is suppressed in the -- case of assignments created by the expander that correspond - -- to initializations, where we do want to copy the tag - -- (Expand_Ctrl_Actions flag is set False in this case). It is - -- also suppressed if restriction No_Dispatching_Calls is in - -- force because in that case predefined primitives are not - -- generated. + -- to initializations, where we do not want to finalize the + -- target (Expand_Ctrl_Actions is set to False in this case). + -- It is also suppressed if restriction No_Dispatching_Calls + -- is in force because in that case predefined primitives are + -- not generated. or else (Is_Tagged_Type (Typ) and then Chars (Current_Scope) /= Name_uAssign @@ -3018,13 +3015,70 @@ package body Exp_Ch5 is L := New_List; - -- In case of assignment to a class-wide tagged type, before - -- the assignment we generate run-time check to ensure that - -- the tags of source and target match. + -- Handle assignment of a mutably tagged type + + if Is_Mutably_Tagged_Type (Typ) then + declare + Lhs_Tag : constant Node_Id := + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Lhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)); + + Rhs_Tag : constant Node_Id := + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Rhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)); + + begin + -- Create a tag check when we have the extra + -- constrained formal and it is true (meaning we + -- are not dealing with a mutably tagged object). + + if not Tag_Checks_Suppressed (Typ) + and then Is_Entity_Name (Lhs) + and then Is_Formal (Entity (Lhs)) + and then Present (Extra_Constrained (Entity (Lhs))) + then + Append_To (L, + Make_If_Statement (Loc, + Condition => + New_Occurrence_Of + (Extra_Constrained (Entity (Lhs)), Loc), + Then_Statements => New_List ( + Make_Raise_Constraint_Error (Loc, + Condition => + Make_Op_Ne (Loc, + Left_Opnd => Lhs_Tag, + Right_Opnd => Rhs_Tag), + Reason => CE_Tag_Check_Failed)))); + end if; + + -- Generate a tag assignment before the actual + -- assignment so we dispatch to the proper + -- assign version. + + Append_To (L, + Make_Assignment_Statement (Loc, + Name => + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Lhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)), + Expression => + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Rhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)))); + end; + + -- For the assignment of a regular class-wide type, generate + -- a run-time check to ensure that the tag of the source and + -- that of the target match. - if not Tag_Checks_Suppressed (Typ) + elsif not Tag_Checks_Suppressed (Typ) and then Is_Class_Wide_Type (Typ) - and then Is_Tagged_Type (Typ) and then Is_Tagged_Type (Underlying_Type (Etype (Rhs))) then declare @@ -3032,18 +3086,7 @@ package body Exp_Ch5 is Rhs_Tag : Node_Id; begin - if not Is_Interface (Typ) then - Lhs_Tag := - Make_Selected_Component (Loc, - Prefix => Duplicate_Subexpr (Lhs), - Selector_Name => - Make_Identifier (Loc, Name_uTag)); - Rhs_Tag := - Make_Selected_Component (Loc, - Prefix => Duplicate_Subexpr (Rhs), - Selector_Name => - Make_Identifier (Loc, Name_uTag)); - else + if Is_Interface (Typ) then -- Displace the pointer to the base of the objects -- applying 'Address, which is later expanded into -- a call to RE_Base_Address. @@ -3062,66 +3105,26 @@ package body Exp_Ch5 is Make_Attribute_Reference (Loc, Prefix => Duplicate_Subexpr (Rhs), Attribute_Name => Name_Address))); - end if; - - -- Handle assignment to a mutably tagged type - - if Is_Mutably_Tagged_Conversion (Lhs) - or else Is_Mutably_Tagged_Type (Typ) - or else Is_Mutably_Tagged_Type (Etype (Lhs)) - then - -- Create a tag check when we have the extra - -- constrained formal and it is true (meaning we - -- are not dealing with a mutably tagged object). - - if Is_Entity_Name (Name (N)) - and then Is_Formal (Entity (Name (N))) - and then Present - (Extra_Constrained (Entity (Name (N)))) - then - Append_To (L, - Make_If_Statement (Loc, - Condition => - New_Occurrence_Of - (Extra_Constrained - (Entity (Name (N))), Loc), - Then_Statements => New_List ( - Make_Raise_Constraint_Error (Loc, - Condition => - Make_Op_Ne (Loc, - Left_Opnd => Lhs_Tag, - Right_Opnd => Rhs_Tag), - Reason => CE_Tag_Check_Failed)))); - end if; - - -- Generate a tag assignment before the actual - -- assignment so we dispatch to the proper - -- assign version. - - Append_To (L, - Make_Assignment_Statement (Loc, - Name => - Make_Selected_Component (Loc, - Prefix => Duplicate_Subexpr (Lhs), - Selector_Name => - Make_Identifier (Loc, Name_uTag)), - Expression => - Make_Selected_Component (Loc, - Prefix => Duplicate_Subexpr (Rhs), - Selector_Name => - Make_Identifier (Loc, Name_uTag)))); - - -- Otherwise generate a normal tag check - else - Append_To (L, - Make_Raise_Constraint_Error (Loc, - Condition => - Make_Op_Ne (Loc, - Left_Opnd => Lhs_Tag, - Right_Opnd => Rhs_Tag), - Reason => CE_Tag_Check_Failed)); + Lhs_Tag := + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Lhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)); + Rhs_Tag := + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr (Rhs), + Selector_Name => + Make_Identifier (Loc, Name_uTag)); end if; + + Append_To (L, + Make_Raise_Constraint_Error (Loc, + Condition => + Make_Op_Ne (Loc, + Left_Opnd => Lhs_Tag, + Right_Opnd => Rhs_Tag), + Reason => CE_Tag_Check_Failed)); end; end if; @@ -3150,7 +3153,7 @@ package body Exp_Ch5 is end; end; - -- Untagged case + -- Untagged case, or initialization in tagged case else declare @@ -6497,13 +6500,16 @@ package body Exp_Ch5 is Ctrl_Act : constant Boolean := Needs_Finalization (T) and then not No_Ctrl_Actions (N) and then not No_Finalize_Actions (N); + Mute_Tag : constant Boolean := Is_Mutably_Tagged_CW_Equivalent_Type (T); Save_Tag : constant Boolean := Is_Tagged_Type (T) and then not Comp_Asn + and then not Mute_Tag and then not No_Ctrl_Actions (N) and then not No_Finalize_Actions (N) and then Tagged_Type_Expansion; Set_Tag : constant Boolean := Is_Tagged_Type (T) and then not Comp_Asn + and then not Mute_Tag and then not No_Ctrl_Actions (N) and then Tagged_Type_Expansion; Adj_Call : Node_Id; @@ -6583,6 +6589,17 @@ package body Exp_Ch5 is if Comp_Asn then Set_Analyzed (New_N, False); Set_Componentwise_Assignment (New_N, True); + + -- If this is an assignment of a mutably tagged type, we need to assign + -- only the bits present in the source, so we strip a conversion to the + -- mutably tagged type so as to expose the source to the code generator. + + elsif Mute_Tag + and then Nkind (Expression (N)) in N_Type_Conversion + | N_Unchecked_Type_Conversion + and then Etype (Expression (N)) = Corresponding_Mutably_Tagged_Type (T) + then + Rewrite (Expression (New_N), Expression (Expression (N))); end if; Append_To (Res, New_N); diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index 53f889689611..ea6e239f2435 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -95,7 +95,7 @@ package body Exp_Ch6 is -- front end, or in the back end, or partly in both ends, depending on the -- result type. - -- Result type | Return mechanism | Front end | Back end + -- Result type | Return mechanism | Front end | Back end -- -------------------------------------------------------------------- -- Limited Build In Place All @@ -106,13 +106,12 @@ package body Exp_Ch6 is -- Needs Fin. Secondary Stack All -- (BERS False) - -- Needs Fin. Invisible Parameter All All - -- (BERS True) (return) (call) + -- Needs Fin. Invisible Parameter All + -- (BERS True) -- By Reference Invisible Parameter All - -- Others Primary stack/ All - -- Registers + -- Others Primary stack/Registers All -- Needs Fin.: type needs finalization [RM 7.6(9.1/2-9.6/2)] -- BERS: Opt.Back_End_Return_Slot setting @@ -1830,8 +1829,8 @@ package body Exp_Ch6 is Make_Assignment_Statement (Loc, Name => New_Occurrence_Of ( Extra_Accessibility (Entity (Lhs)), Loc), - Expression => Make_Integer_Literal (Loc, - Type_Access_Level (E_Formal)))); + Expression => + Dynamic_Type_Access_Level (E_Formal))); else if Is_Access_Type (E_Formal) @@ -2907,15 +2906,6 @@ package body Exp_Ch6 is -- default parameters and for extra actuals (for Extra_Formals). The -- argument is an N_Parameter_Association node. - procedure Add_Cond_Expression_Extra_Actual (Formal : Entity_Id); - -- Adds extra accessibility actuals in the case of a conditional - -- expression corresponding to Formal. - - -- Note: Conditional expressions used as actuals for anonymous access - -- formals complicate the process of propagating extra accessibility - -- actuals and must be handled in a recursive fashion since they can - -- be embedded within each other. - procedure Add_Dummy_Build_In_Place_Actuals (Function_Id : Entity_Id; Num_Added_Extra_Actuals : Nat := 0); @@ -2928,177 +2918,6 @@ package body Exp_Ch6 is -- expression for the value of the actual, EF is the entity for the -- extra formal. - -------------------------------------- - -- Add_Cond_Expression_Extra_Actual -- - -------------------------------------- - - procedure Add_Cond_Expression_Extra_Actual - (Formal : Entity_Id) - is - Decl : Node_Id; - Lvl : Entity_Id; - - procedure Insert_Level_Assign (Branch : Node_Id); - -- Recursively add assignment of the level temporary on each branch - -- while moving through nested conditional expressions. - - ------------------------- - -- Insert_Level_Assign -- - ------------------------- - - procedure Insert_Level_Assign (Branch : Node_Id) is - - procedure Expand_Branch (Res_Assn : Node_Id); - -- Perform expansion or iterate further within nested - -- conditionals given the object declaration or assignment to - -- result object created during expansion which represents a - -- branch of the conditional expression. - - ------------------- - -- Expand_Branch -- - ------------------- - - procedure Expand_Branch (Res_Assn : Node_Id) is - begin - pragma Assert (Nkind (Res_Assn) in - N_Assignment_Statement | - N_Object_Declaration); - - -- There are more nested conditional expressions so we must go - -- deeper. - - if Nkind (Expression (Res_Assn)) = N_Expression_With_Actions - and then - Nkind (Original_Node (Expression (Res_Assn))) - in N_Case_Expression | N_If_Expression - then - Insert_Level_Assign - (Expression (Res_Assn)); - - -- Add the level assignment - - else - Insert_Before_And_Analyze (Res_Assn, - Make_Assignment_Statement (Loc, - Name => New_Occurrence_Of (Lvl, Loc), - Expression => - Accessibility_Level - (Expr => Expression (Res_Assn), - Level => Dynamic_Level, - Allow_Alt_Model => False))); - end if; - end Expand_Branch; - - Cond : Node_Id; - Alt : Node_Id; - - -- Start of processing for Insert_Level_Assign - - begin - -- Examine further nested conditionals - - pragma Assert (Nkind (Branch) = - N_Expression_With_Actions); - - -- Find the relevant statement in the actions - - Cond := First (Actions (Branch)); - while Present (Cond) loop - exit when Nkind (Cond) in N_Case_Statement | N_If_Statement; - Next (Cond); - end loop; - - -- The conditional expression may have been optimized away, so - -- examine the actions in the branch. - - if No (Cond) then - Expand_Branch (Last (Actions (Branch))); - - -- Iterate through if expression branches - - elsif Nkind (Cond) = N_If_Statement then - Expand_Branch (Last (Then_Statements (Cond))); - Expand_Branch (Last (Else_Statements (Cond))); - - -- Iterate through case alternatives - - elsif Nkind (Cond) = N_Case_Statement then - - Alt := First (Alternatives (Cond)); - while Present (Alt) loop - Expand_Branch (Last (Statements (Alt))); - Next (Alt); - end loop; - end if; - end Insert_Level_Assign; - - -- Start of processing for cond expression case - - begin - -- Create declaration of a temporary to store the accessibility - -- level of each branch of the conditional expression. - - Lvl := Make_Temporary (Loc, 'L'); - Decl := Make_Object_Declaration (Loc, - Defining_Identifier => Lvl, - Object_Definition => - New_Occurrence_Of (Standard_Natural, Loc)); - - -- Install the declaration and perform necessary expansion if we - -- are dealing with a procedure call. - - if Nkind (Call_Node) = N_Procedure_Call_Statement then - -- Generate: - -- Lvl : Natural; - -- Call ( - -- {do - -- If_Exp_Res : Typ; - -- if Cond then - -- Lvl := 0; -- Access level - -- If_Exp_Res := Exp; - -- ... - -- in If_Exp_Res end;}, - -- Lvl, - -- ... - -- ) - - Insert_Before_And_Analyze (Call_Node, Decl); - - -- Ditto for a function call. Note that we do not wrap the function - -- call into an expression with action to avoid bad interactions with - -- Exp_Ch4.Process_Transient_In_Expression. - - else - -- Generate: - -- Lvl : Natural; -- placed above the function call - -- ... - -- Func_Call ( - -- {do - -- If_Exp_Res : Typ - -- if Cond then - -- Lvl := 0; -- Access level - -- If_Exp_Res := Exp; - -- in If_Exp_Res end;}, - -- Lvl, - -- ... - -- ) - - Insert_Action (Call_Node, Decl); - Analyze (Call_Node); - end if; - - -- Decorate the conditional expression with assignments to our level - -- temporary. - - Insert_Level_Assign (Prev); - - -- Make our level temporary the passed actual - - Add_Extra_Actual - (Expr => New_Occurrence_Of (Lvl, Loc), - EF => Extra_Accessibility (Formal)); - end Add_Cond_Expression_Extra_Actual; - -------------------------------------- -- Add_Dummy_Build_In_Place_Actuals -- -------------------------------------- @@ -3336,8 +3155,10 @@ package body Exp_Ch6 is goto Skip_Extra_Actual_Generation; else - -- If the actual is a type conversion, then the constrained - -- test applies to the actual, not the target type. + -- If the actual is a type conversion and the target type is + -- constrained, then the view is constrained (RM 4.6(54)). + -- Otherwise, the test needs to be applied to the operand of + -- the conversion. declare Act_Prev : Node_Id; @@ -3350,6 +3171,9 @@ package body Exp_Ch6 is while Nkind (Act_Prev) in N_Type_Conversion | N_Unchecked_Type_Conversion loop + exit when Nkind (Act_Prev) = N_Type_Conversion + and then Is_Constrained (Etype (Act_Prev)); + Act_Prev := Expression (Act_Prev); end loop; @@ -3367,6 +3191,11 @@ package body Exp_Ch6 is (Expr => New_Occurrence_Of (Standard_False, Loc), EF => Extra_Constrained (Formal)); + elsif Nkind (Act_Prev) = N_Type_Conversion then + Add_Extra_Actual + (Expr => New_Occurrence_Of (Standard_True, Loc), + EF => Extra_Constrained (Formal)); + else Add_Extra_Actual (Expr => @@ -3415,21 +3244,11 @@ package body Exp_Ch6 is end if; Add_Extra_Actual - (Expr => Accessibility_Level - (Expr => Parm_Ent, - Level => Dynamic_Level, - Allow_Alt_Model => False), + (Expr => Dynamic_Accessibility_Level + (Parm_Ent, Allow_Alt_Model => False), EF => Extra_Accessibility (Formal)); end; - -- Conditional expressions - - elsif Nkind (Prev) = N_Expression_With_Actions - and then Nkind (Original_Node (Prev)) in - N_If_Expression | N_Case_Expression - then - Add_Cond_Expression_Extra_Actual (Formal); - -- Internal constant generated to remove side effects (normally -- from the expansion of dispatching calls). @@ -3458,9 +3277,8 @@ package body Exp_Ch6 is end if; Add_Extra_Actual - (Expr => Accessibility_Level - (Expr => Expression (Parent (Ent)), - Level => Dynamic_Level, + (Expr => Dynamic_Accessibility_Level + (Expression (Parent (Ent)), Allow_Alt_Model => False), EF => Extra_Accessibility (Formal)); end; @@ -3469,10 +3287,8 @@ package body Exp_Ch6 is else Add_Extra_Actual - (Expr => Accessibility_Level - (Expr => Prev, - Level => Dynamic_Level, - Allow_Alt_Model => False), + (Expr => Dynamic_Accessibility_Level + (Prev, Allow_Alt_Model => False), EF => Extra_Accessibility (Formal)); end if; end if; @@ -3515,10 +3331,8 @@ package body Exp_Ch6 is -- Otherwise get the level normally based on the call node else - Level := Accessibility_Level - (Expr => Call_Node, - Level => Dynamic_Level, - Allow_Alt_Model => False); + Level := Dynamic_Accessibility_Level + (Call_Node, Allow_Alt_Model => False); end if; -- It may be possible that we are re-expanding an already @@ -7603,7 +7417,7 @@ package body Exp_Ch6 is -- [Constraint_Error when not (Exp in R_Type)] In_Test : constant Node_Id := - Make_Not_In + Make_In (Loc, Duplicate_Subexpr (Exp), New_Occurrence_Of (R_Type, Loc)); @@ -9877,8 +9691,8 @@ package body Exp_Ch6 is and then (Has_Task (Typ) or else (Is_Class_Wide_Type (Typ) and then Is_Limited_Record (Typ) - and then not Has_Aspect - (Etype (Typ), Aspect_No_Task_Parts))); + and then not Has_Enabled_Aspect + (Root_Type (Typ), Aspect_No_Task_Parts))); end Might_Have_Tasks; ---------------------------- diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb index 11c86895aa16..c46cd8cd2ef1 100644 --- a/gcc/ada/exp_ch7.adb +++ b/gcc/ada/exp_ch7.adb @@ -46,6 +46,7 @@ with Freeze; use Freeze; with GNAT_CUDA; use GNAT_CUDA; with Inline; use Inline; with Lib; use Lib; +with Mutably_Tagged; use Mutably_Tagged; with Nlists; use Nlists; with Nmake; use Nmake; with Opt; use Opt; @@ -4384,23 +4385,19 @@ package body Exp_Ch7 is => return Curr; - -- Statements + -- Statements and statement-like constructs - -- Statements and statement-like constructs act as a boundary - -- for a transient scope. + -- Expressions of compound statements are master constructs so + -- they act as a boundary for a transient scope. when N_Accept_Alternative | N_Attribute_Definition_Clause | N_Case_Statement | N_Case_Statement_Alternative - | N_Code_Statement | N_Delay_Alternative - | N_Delay_Until_Statement - | N_Delay_Relative_Statement | N_Discriminant_Association | N_Elsif_Part | N_Entry_Body_Formal_Part - | N_Exit_Statement | N_If_Statement | N_Iteration_Scheme | N_Terminate_Alternative @@ -4408,7 +4405,23 @@ package body Exp_Ch7 is pragma Assert (Present (Prev)); return Prev; - when N_Assignment_Statement => + -- An exit statement only alters the control flow, so there + -- is no need to wait until after its completion to finalize + -- its expression (which is however not a master construct). + + when N_Exit_Statement => + pragma Assert (Present (Prev)); + return Prev; + + -- Expressions of simple statements are not master constructs + -- (except for a simple return), so only the statements act as + -- a boundary for a transient scope. + + when N_Assignment_Statement + | N_Code_Statement + | N_Delay_Relative_Statement + | N_Delay_Until_Statement + => return Curr; when N_Entry_Call_Statement @@ -5508,7 +5521,7 @@ package body Exp_Ch7 is if Is_Class_Wide_Type (Typ) then Utyp := Root_Type (Typ); else - Utyp := Typ; + Utyp := Get_Corresponding_Tagged_Type_If_Present (Typ); end if; Utyp := Underlying_Type (Base_Type (Utyp)); @@ -7892,7 +7905,7 @@ package body Exp_Ch7 is Ref := Convert_Concurrent (Ref, Underlying_Type (Typ)); else - Utyp := Typ; + Utyp := Get_Corresponding_Tagged_Type_If_Present (Typ); Atyp := Typ; end if; @@ -8469,7 +8482,7 @@ package body Exp_Ch7 is else Is_Conc := False; - Utyp := Typ; + Utyp := Get_Corresponding_Tagged_Type_If_Present (Typ); end if; Utyp := Underlying_Type (Base_Type (Utyp)); @@ -8500,22 +8513,28 @@ package body Exp_Ch7 is -- [Deep_]Initialize primitive to call. -- If Typ is protected then no additional processing is needed either. - if No (Utyp) - or else Is_Protected_Type (Typ) - then + if No (Utyp) or else Is_Protected_Type (Typ) then return Empty; end if; - -- Select the appropriate version of initialize + -- Select the appropriate version of Initialize if Has_Controlled_Component (Utyp) then Proc := TSS (Utyp, TSS_Deep_Initialize); - elsif Is_Mutably_Tagged_Type (Utyp) then - Proc := Find_Controlled_Prim_Op (Etype (Utyp), Name_Initialize); - Check_Visibly_Controlled (Initialize_Case, Etype (Typ), Proc, Ref); - else + + -- Derivations from [Limited_]Controlled + + elsif Is_Controlled (Utyp) then Proc := Find_Controlled_Prim_Op (Utyp, Name_Initialize); Check_Visibly_Controlled (Initialize_Case, Typ, Proc, Ref); + + -- Mutably tagged types without controlled parts in the root type + + elsif Is_Mutably_Tagged_CW_Equivalent_Type (Typ) then + return Empty; + + else + raise Program_Error; end if; -- If initialization procedure for an array of controlled objects is diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index c2fc6c8a284f..baf7c97ad1b8 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -9612,13 +9612,14 @@ package body Exp_Ch9 is -- end; procedure Expand_N_Requeue_Statement (N : Node_Id) is - Loc : constant Source_Ptr := Sloc (N); - Conc_Typ : Entity_Id; - Concval : Node_Id; - Ename : Node_Id; - Enc_Subp : Entity_Id; - Index : Node_Id; - Old_Typ : Entity_Id; + Loc : constant Source_Ptr := Sloc (N); + + Conc_Typ : Entity_Id; + Concval : Node_Id; + Ename : Node_Id; + Enclosing : Entity_Id; + Index : Node_Id; + Old_Typ : Entity_Id; function Build_Dispatching_Call_Equivalent return Node_Id; -- Ada 2012 (AI05-0030): N denotes a dispatching requeue statement of @@ -10128,38 +10129,40 @@ package body Exp_Ch9 is -- type. This will constitute our invocation source. Old_Typ := Current_Scope; - while Present (Old_Typ) - and then not Is_Concurrent_Type (Old_Typ) - loop + while Present (Old_Typ) and then not Is_Concurrent_Type (Old_Typ) loop Old_Typ := Scope (Old_Typ); end loop; -- Obtain the innermost enclosing callable construct for use in - -- generating a dynamic accessibility check. - - Enc_Subp := Current_Scope; + -- generating a dynamic accessibility check per RM 9.5.4(7.2). - if Ekind (Enc_Subp) not in Entry_Kind | Subprogram_Kind then - Enc_Subp := Enclosing_Subprogram (Enc_Subp); - end if; + Enclosing := Empty; + for J in reverse 0 .. Scope_Stack.Last loop + Enclosing := Scope_Stack.Table (J).Entity; + exit when Is_Entry (Enclosing); + end loop; - -- Generate a dynamic accessibility check on the target object + -- Generate a dynamic accessibility check on the target object, unless + -- it is a parameter of the innermost enclosing callable construct. - Insert_Before_And_Analyze (N, - Make_Raise_Program_Error (Loc, - Condition => - Make_Op_Gt (Loc, - Left_Opnd => Accessibility_Level (Name (N), Dynamic_Level), - Right_Opnd => Make_Integer_Literal (Loc, - Scope_Depth (Enc_Subp))), - Reason => PE_Accessibility_Check_Failed)); + if not Is_Entity_Name (Original_Node (Concval)) + or else not Is_Formal (Entity (Original_Node (Concval))) + or else Enclosing /= Scope (Entity (Original_Node (Concval))) + then + Insert_Before_And_Analyze (N, + Make_Raise_Program_Error (Loc, + Condition => + Make_Op_Gt (Loc, + Left_Opnd => Dynamic_Accessibility_Level (Name (N)), + Right_Opnd => Dynamic_Local_Access_Level (Enclosing)), + Reason => PE_Accessibility_Check_Failed)); + end if; -- Ada 2012 (AI05-0030): We have a dispatching requeue of the form -- Concval.Ename where the type of Concval is class-wide concurrent -- interface. if Ada_Version >= Ada_2012 - and then Present (Concval) and then Is_Class_Wide_Type (Conc_Typ) and then Is_Concurrent_Interface (Conc_Typ) then diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index bc2ad51c89c4..299956e7bca2 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -5064,7 +5064,7 @@ package body Exp_Disp is -- TSD : Type_Specific_Data (I_Depth) := -- (Idepth => I_Depth, - -- Access_Level => Type_Access_Level (Typ), + -- Access_Level => Dynamic_Type_Access_Level (Typ), -- Alignment => Typ'Alignment, -- Expanded_Name => Cstring_Ptr!(Exname'Address)) -- External_Tag => Cstring_Ptr!(Exname'Address)) @@ -5111,8 +5111,7 @@ package body Exp_Disp is -- Access_Level - Append_To (TSD_Aggr_List, - Make_Integer_Literal (Loc, Type_Access_Level (Typ))); + Append_To (TSD_Aggr_List, Dynamic_Type_Access_Level (Typ)); -- Alignment diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index f4bcd18dab75..d587fb16c8f4 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -41,6 +41,7 @@ with Ghost; use Ghost; with Inline; use Inline; with Itypes; use Itypes; with Lib; use Lib; +with Mutably_Tagged; use Mutably_Tagged; with Nlists; use Nlists; with Nmake; use Nmake; with Opt; use Opt; @@ -6302,7 +6303,8 @@ package body Exp_Util is function Finalize_Address (Typ : Entity_Id) return Entity_Id is Btyp : constant Entity_Id := Base_Type (Typ); - Utyp : Entity_Id := Typ; + Utyp : Entity_Id := + Get_Corresponding_Mutably_Tagged_Type_If_Present (Typ); begin -- Handle protected class-wide or task class-wide types @@ -10730,10 +10732,10 @@ package body Exp_Util is end if; -- Set Is_Class_Wide_Equivalent_Type very early to trigger the special - -- treatment for this type. In particular, even though _parent's type + -- treatment for this type. In particular, even though _Parent's type -- is a controlled type or contains controlled components, we do not - -- want to set Has_Controlled_Component on it to avoid making it gain - -- an unwanted _controller component. + -- want to set Has_Controlled_Component on the equivalent type because + -- we do not want to build internal controlled primitives for it. Set_Is_Class_Wide_Equivalent_Type (Equiv_Type); diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 4c516fe9667f..28214ab2614e 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -149,14 +149,14 @@ package body Freeze is -- that if a foreign convention is specified, and no specific size -- is given, then the size must be at least Integer'Size. - procedure Freeze_Expr_Types + procedure Freeze_Full_Expression (Expr : Node_Id; N : Node_Id; Def_Id : Entity_Id; Result : in out List_Id; Before : Boolean := False; Typ : Entity_Id := Empty); - -- Same as Freeze_Expr_Types_Before if Before is True, but appends the + -- Same as Freeze_Full_Expression_Before if Before is True, but appends the -- resulting list of nodes to Result if Before is False, modifying Result -- from No_List if necessary. @@ -2746,16 +2746,12 @@ package body Freeze is procedure Freeze_Before (N : Node_Id; - T : Entity_Id; + E : Entity_Id; Do_Freeze_Profile : Boolean := True) is - -- Freeze T, then insert the generated Freeze nodes before the node N. - -- Flag Freeze_Profile is used when T is an overloadable entity, and - -- indicates whether its profile should be frozen at the same time. - Freeze_Nodes : constant List_Id := - Freeze_Entity (T, N, Do_Freeze_Profile); - Pack : constant Entity_Id := Scope (T); + Freeze_Entity (E, N, Do_Freeze_Profile); + Scop : constant Entity_Id := Scope (E); begin if Is_Non_Empty_List (Freeze_Nodes) then @@ -2766,12 +2762,12 @@ package body Freeze is -- which may include generated subprograms such as predicate -- functions, etc. - if Is_Type (T) and then From_Nested_Package (T) then - Push_Scope (Pack); - Install_Visible_Declarations (Pack); - Install_Private_Declarations (Pack); + if Is_Type (E) and then From_Nested_Package (E) then + Push_Scope (Scop); + Install_Visible_Declarations (Scop); + Install_Private_Declarations (Scop); Insert_Actions (N, Freeze_Nodes); - End_Package_Scope (Pack); + End_Package_Scope (Scop); else Insert_Actions (N, Freeze_Nodes); @@ -5039,7 +5035,7 @@ package body Freeze is -- Accumulates total Esize values of all elementary components. Used -- for processing of Implicit_Packing. - Final_Storage_Only : Boolean := True; + Final_Storage_Only : Boolean; -- Used to compute the Finalize_Storage_Only flag Placed_Component : Boolean := False; @@ -5047,7 +5043,7 @@ package body Freeze is -- clause (used to warn about useless Bit_Order pragmas, and also -- to detect cases where Implicit_Packing may have an effect). - Relaxed_Finalization : Boolean := True; + Relaxed_Finalization : Boolean; -- Used to compute the Has_Relaxed_Finalization flag Sized_Component_Total_RM_Size : Uint := Uint_0; @@ -5834,6 +5830,17 @@ package body Freeze is Freeze_And_Append (Corresponding_Remote_Type (Rec), N, Result); end if; + -- Initialize Final_Storage_Only and Relaxed_Finalization from the + -- current state if we have inherited controlled components. + + if Has_Controlled_Component (Rec) then + Final_Storage_Only := Finalize_Storage_Only (Rec); + Relaxed_Finalization := Has_Relaxed_Finalization (Rec); + else + Final_Storage_Only := True; + Relaxed_Finalization := True; + end if; + -- Check for tasks, protected and controlled components, unchecked -- unions, and type invariants. @@ -5841,22 +5848,12 @@ package body Freeze is while Present (Comp) loop Propagate_Concurrent_Flags (Rec, Etype (Comp)); - -- Do not set Has_Controlled_Component on a class-wide - -- equivalent type. See Make_CW_Equivalent_Type. + -- Do not set Has_Controlled_Component on a CW equivalent type, + -- see Exp_Util.Make_CW_Equivalent_Type. if not Is_Class_Wide_Equivalent_Type (Rec) - and then - (Has_Controlled_Component (Etype (Comp)) - or else - (Chars (Comp) /= Name_uParent - and then Is_Controlled (Etype (Comp))) - or else - (Is_Protected_Type (Etype (Comp)) - and then - Present (Corresponding_Record_Type (Etype (Comp))) - and then - Has_Controlled_Component - (Corresponding_Record_Type (Etype (Comp))))) + and then Chars (Comp) /= Name_uParent + and then Needs_Finalization (Etype (Comp)) then Set_Has_Controlled_Component (Rec); Final_Storage_Only := @@ -5900,7 +5897,7 @@ package body Freeze is -- For a type that is not directly controlled but has controlled -- components, Finalize_Storage_Only is set if all the controlled -- components are Finalize_Storage_Only. The same processing is - -- appled to Has_Relaxed_Finalization. + -- applied to Has_Relaxed_Finalization. if not Is_Controlled (Rec) and then Has_Controlled_Component (Rec) then @@ -8274,7 +8271,7 @@ package body Freeze is if Is_Expression_Function (Subp) then Freeze_And_Append (Subp, N, Result, Do_Freeze_Profile => False); - Freeze_Expr_Types + Freeze_Full_Expression (Expr => Expression_Of_Expression_Function (Subp), N => N, Def_Id => Subp, @@ -9227,7 +9224,7 @@ package body Freeze is -- Freeze types in expression function (RM 13.14(10.1, 10.2, 10.3)) if Is_Expression_Function (Nam) then - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => P, Expr => Expression_Of_Expression_Function (Nam), Def_Id => Nam); @@ -9239,11 +9236,11 @@ package body Freeze is In_Spec_Expression := In_Spec_Exp; end Freeze_Expression; - ----------------------- - -- Freeze_Expr_Types -- - ----------------------- + ---------------------------- + -- Freeze_Full_Expression -- + ---------------------------- - procedure Freeze_Expr_Types + procedure Freeze_Full_Expression (Expr : Node_Id; N : Node_Id; Def_Id : Entity_Id; @@ -9258,9 +9255,6 @@ package body Freeze is procedure Explain_Error; -- Output an explanation of the error as continuation messages - procedure Find_Incomplete_Constant (Node : Node_Id); - -- Search for a deferred constant without completion - function Freeze_Type_Refs (Node : Node_Id) return Traverse_Result; -- Freeze all types referenced in the subtree rooted at Node @@ -9348,41 +9342,6 @@ package body Freeze is end if; end Explain_Error; - ------------------------------ - -- Find_Incomplete_Constant -- - ------------------------------ - - procedure Find_Incomplete_Constant (Node : Node_Id) is - begin - -- When a constant is initialized with the result of a dispatching - -- call, the constant declaration is rewritten as a renaming of the - -- displaced function result. This scenario is not a premature use of - -- a constant even though the Has_Completion flag is not set. - - if Is_Entity_Name (Node) - and then Present (Entity (Node)) - and then Ekind (Entity (Node)) = E_Constant - and then Scope (Entity (Node)) = Current_Scope - and then Nkind (Declaration_Node (Entity (Node))) = - N_Object_Declaration - and then not Is_Imported (Entity (Node)) - and then not Has_Completion (Entity (Node)) - and then not - (Present (Full_View (Entity (Node))) - and then (Has_Completion (Full_View (Entity (Node))) - or else - Declaration_Node (Full_View (Entity (Node))) = N)) - then - Error_Msg_NE - ("deferred constant& is frozen before completion", - N, Entity (Node)); - - Explain_Error; - - Set_Is_Frozen (Entity (Node)); - end if; - end Find_Incomplete_Constant; - ---------------------- -- Freeze_Type_Refs -- ---------------------- @@ -9441,22 +9400,59 @@ package body Freeze is -- Check that a type referenced by an entity can be frozen if Is_Entity_Name (Node) and then Present (Entity (Node)) then - -- The entity itself may be a type, as in a membership test - -- or an attribute reference. Freezing its own type would be - -- incomplete if the entity is derived or an extension. + declare + E : constant Entity_Id := Entity (Node); + + begin + -- The entity itself may be a type, as in a membership test + -- or an attribute reference. Freezing its own type would be + -- incomplete if the entity is derived or an extension. - if Is_Type (Entity (Node)) then - Check_And_Freeze_Type (Entity (Node)); + if Is_Type (E) then + Check_And_Freeze_Type (E); + else + Check_And_Freeze_Type (Etype (E)); + end if; - else - Check_And_Freeze_Type (Etype (Entity (Node))); - end if; + -- Check that the enclosing record type can be frozen - -- Check that the enclosing record type can be frozen + if Ekind (E) in E_Component | E_Discriminant then + Check_And_Freeze_Type (Scope (E)); + end if; - if Ekind (Entity (Node)) in E_Component | E_Discriminant then - Check_And_Freeze_Type (Scope (Entity (Node))); - end if; + -- Freeze stand-alone objects declared in the current scope + + if Ekind (E) in E_Constant | E_Variable + and then Nkind (Declaration_Node (E)) = N_Object_Declaration + and then Scope (E) = Current_Scope + and then not Is_Frozen (E) + then + -- The completion of a deferred constant declaration must + -- occur before the constant is frozen (RM 7.4(9)). Give a + -- better error message here than at the completion point. + + if Ekind (E) = E_Constant + and then not Is_Imported (E) + and then not Has_Completion (E) + and then not (Present (Full_View (E)) + and then Has_Completion (Full_View (E))) + then + Error_Msg_NE + ("deferred constant& is frozen before completion", + N, E); + + Explain_Error; + + Set_Is_Frozen (E); + + elsif Before then + Freeze_Before (N, E); + + else + Freeze_And_Append (E, N, Result); + end if; + end if; + end; -- Freezing an access type does not freeze the designated type, but -- freezing conversions between access to interfaces requires that @@ -9513,20 +9509,14 @@ package body Freeze is end; end if; - Find_Incomplete_Constant (Node); - -- No point in posting several errors on the same expression - if Serious_Errors_Detected > 0 then - return Abandon; - else - return OK; - end if; + return (if Serious_Errors_Detected > 0 then Abandon else OK); end Freeze_Type_Refs; procedure Freeze_References is new Traverse_Proc (Freeze_Type_Refs); - -- Start of processing for Freeze_Expr_Types + -- Start of processing for Freeze_Full_Expression begin -- Preanalyze a duplicate of the expression to have available the @@ -9577,13 +9567,13 @@ package body Freeze is else Freeze_References (Expr); end if; - end Freeze_Expr_Types; + end Freeze_Full_Expression; - ------------------------------ - -- Freeze_Expr_Types_Before -- - ------------------------------ + ----------------------------------- + -- Freeze_Full_Expression_Before -- + ----------------------------------- - procedure Freeze_Expr_Types_Before + procedure Freeze_Full_Expression_Before (N : Node_Id; Expr : Node_Id; Def_Id : Entity_Id; @@ -9592,14 +9582,14 @@ package body Freeze is Dummy : List_Id := No_List; begin - Freeze_Expr_Types + Freeze_Full_Expression (Expr => Expr, N => N, Def_Id => Def_Id, Result => Dummy, Before => True, Typ => Typ); - end Freeze_Expr_Types_Before; + end Freeze_Full_Expression_Before; ----------------------------- -- Freeze_Fixed_Point_Type -- diff --git a/gcc/ada/freeze.ads b/gcc/ada/freeze.ads index 995ff04187b4..7e5d31f92b14 100644 --- a/gcc/ada/freeze.ads +++ b/gcc/ada/freeze.ads @@ -96,7 +96,7 @@ package Freeze is -- Objects with dynamic address clauses -- - -- These have a delayed freeze. Gigi will generate code to evaluate + -- These have delayed freezing. Gigi will generate code to evaluate -- the initialization expression if present and store it in a temp. -- The actual object is created at the point of the freeze, and if -- necessary initialized by copying the value of this temporary. @@ -183,19 +183,6 @@ package Freeze is -- If Initialization_Statements (E) is an N_Compound_Statement, insert its -- actions at the appropriate point and clear the attribute. - function Freeze_Entity - (E : Entity_Id; - N : Node_Id; - Do_Freeze_Profile : Boolean := True) return List_Id; - -- Freeze an entity, and return Freeze nodes, to be inserted at the point - -- of call. N is a node whose source location corresponds to the freeze - -- point. This is used in placing warning messages in the situation where - -- it appears that a type has been frozen too early, e.g. when a primitive - -- operation is declared after the freezing point of its tagged type. - -- Returns No_List if no freeze nodes needed. Parameter Do_Freeze_Profile - -- is used when E is a subprogram, and determines whether the profile of - -- the subprogram should be frozen as well. - procedure Freeze_All (From : Entity_Id; After : in out Node_Id); -- Before a non-instance body, or at the end of a declarative part, -- freeze all entities therein that are not yet frozen. Calls itself @@ -212,28 +199,44 @@ package Freeze is procedure Freeze_Before (N : Node_Id; - T : Entity_Id; + E : Entity_Id; Do_Freeze_Profile : Boolean := True); - -- Freeze T then Insert the generated Freeze nodes before the node N. Flag - -- Do_Freeze_Profile is used when T is an overloadable entity and indicates - -- whether its profile should be frozen at the same time. + -- Freeze entity E and Insert the generated Freeze nodes before the node N. + -- The Flag Do_Freeze_Profile is used when T is an overloadable entity and + -- indicates whether its profile should be frozen at the same time. + + function Freeze_Entity + (E : Entity_Id; + N : Node_Id; + Do_Freeze_Profile : Boolean := True) return List_Id; + -- Freeze entity E, and return Freeze nodes, to be inserted at the point + -- of call. N is a node whose source location corresponds to the freeze + -- point. This is used in placing warning messages in the situation where + -- it appears that a type has been frozen too early, e.g. when a primitive + -- operation is declared after the freezing point of its tagged type. + -- Returns No_List if no freeze nodes needed. Parameter Do_Freeze_Profile + -- is used when E is a subprogram, and determines whether the profile of + -- the subprogram should be frozen as well. procedure Freeze_Expression (N : Node_Id); - -- Freezes the required entities when the Expression N causes freezing. + -- Freezes the required entities when subexpression N causes freezing. -- The node N here is either a subexpression node (a "real" expression) -- or a subtype mark, or a subtype indication. The latter two cases are -- not really expressions, but they can appear within expressions and - -- so need to be similarly treated. Freeze_Expression takes care of - -- determining the proper insertion point for generated freeze actions. + -- so need to be similarly treated. Freeze_Expression must be invoked + -- on every subexpression along the normal processing of an expression, + -- and will take care of determining the proper insertion point of the + -- generated freeze actions. - procedure Freeze_Expr_Types_Before + procedure Freeze_Full_Expression_Before (N : Node_Id; Expr : Node_Id; Def_Id : Entity_Id; Typ : Entity_Id := Empty); - -- This procedure freezes before N all the types referenced in Expr, - -- which is either the expression of the expression function Def_Id, - -- or the expression in a pre/post aspect that applies to Def_Id. + -- Freezes before N all the required entities when expression Expr causes + -- freezing, which is either the expression of the expression function + -- Def_Id, or the expression in a pre/post aspect that applies to Def_Id. + -- Freeze_Full_Expression_Before must be invoked once for an expression. -- If Typ is present, it is the type used to preanalyze and resolve a -- copy of Expr; if it is not, Expr is assumed to be already analyzed. diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc index be2df77fcfff..75a60f63fb3d 100644 --- a/gcc/ada/gcc-interface/decl.cc +++ b/gcc/ada/gcc-interface/decl.cc @@ -215,7 +215,7 @@ static bool compile_time_known_address_p (Node_Id); static bool flb_cannot_be_superflat (Node_Id); static bool range_cannot_be_superflat (Node_Id); static bool constructor_address_p (tree); -static bool allocatable_size_p (tree, bool); +static bool allocatable_size_p (tree, bool, bool); static bool initial_value_needs_conversion (tree, tree); static tree update_n_elem (tree, tree, tree); static int compare_field_bitpos (const void *, const void *); @@ -307,6 +307,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) const bool artificial_p = is_artificial (gnat_entity); /* True if debug info is requested for this entity. */ const bool debug_info_p = Needs_Debug_Info (gnat_entity); + const bool exported_p = Is_Exported (gnat_entity); /* True if this entity is to be considered as imported. */ const bool imported_p = (Is_Imported (gnat_entity) && No (Address_Clause (gnat_entity))); @@ -748,7 +749,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) objects by making them volatile. */ bool volatile_flag = (Treat_As_Volatile (gnat_entity) - || (!const_flag && (Is_Exported (gnat_entity) || imported_p))); + || (!const_flag && (exported_p || imported_p))); bool mutable_p = false; bool used_by_ref = false; tree gnu_ext_name = NULL_TREE; @@ -939,7 +940,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) && kind != E_Out_Parameter && Is_Composite_Type (gnat_type) && !Is_Constr_Array_Subt_With_Bounds (gnat_type) - && !Is_Exported (gnat_entity) + && !exported_p && !imported_p && No (gnat_renamed_obj) && No (Address_Clause (gnat_entity)))) @@ -1415,7 +1416,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) if (!allocatable_size_p (TYPE_SIZE_UNIT (gnu_type), global_bindings_p () || !definition - || static_flag) + || static_flag, + exported_p || imported_p) || (gnu_size && !allocatable_size_p (convert (sizetype, size_binop @@ -1423,29 +1425,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) bitsize_unit_node)), global_bindings_p () || !definition - || static_flag))) + || static_flag, + exported_p || imported_p))) { /* Give a warning if the size is constant. */ if ((TREE_CODE (TYPE_SIZE_UNIT (gnu_type)) == INTEGER_CST || (gnu_size && TREE_CODE (gnu_size) == INTEGER_CST)) - && definition) + && definition + && (global_bindings_p () || static_flag)) { - if (imported_p) - { - post_error - ("??too large object cannot be imported directly", - gnat_entity); - post_error ("\\??indirect import will be used instead", + post_error + ("??too large object cannot be allocated statically", + gnat_entity); + post_error ("\\??dynamic allocation will be used instead", gnat_entity); - } - else if (global_bindings_p () || static_flag) - { - post_error - ("??too large object cannot be allocated statically", - gnat_entity); - post_error ("\\??dynamic allocation will be used instead", - gnat_entity); - } } if (volatile_flag && !TYPE_VOLATILE (gnu_type)) @@ -7110,17 +7103,20 @@ constructor_address_p (tree gnu_expr) /* Return true if the size in units represented by GNU_SIZE can be handled by an allocation. If STATIC_P is true, consider only what can be done with a - static allocation. */ + static allocation. If INTERFACE_P is true, the allocation is intended to + be part of an explicit interface to other units, possibly foreign. */ static bool -allocatable_size_p (tree gnu_size, bool static_p) +allocatable_size_p (tree gnu_size, bool static_p, bool interface_p) { /* We can allocate a fixed size if it is a valid for the middle-end but, for a static allocation, we do not allocate more than 2 GB because this would - very likely be unintended and problematic for usual code models. */ - if (TREE_CODE (gnu_size) == INTEGER_CST) - return valid_constant_size_p (gnu_size) - && (!static_p || tree_to_uhwi (gnu_size) <= INT_MAX); + very likely be unintended and problematic for usual code models. But we + do not try to fiddle with allocations that are part of an interface. */ + if (TREE_CODE (gnu_size) == INTEGER_CST) + return (interface_p + || (valid_constant_size_p (gnu_size) + && (!static_p || tree_to_uhwi (gnu_size) <= INT_MAX))); /* We can allocate a variable size if this isn't a static allocation. */ else diff --git a/gcc/ada/gcc-interface/misc.cc b/gcc/ada/gcc-interface/misc.cc index 505c48606a59..9c56afed5e57 100644 --- a/gcc/ada/gcc-interface/misc.cc +++ b/gcc/ada/gcc-interface/misc.cc @@ -788,7 +788,7 @@ gnat_get_array_descr_info (const_tree const_type, { tree type = const_cast (const_type); tree first_dimen, dimen; - bool is_array; + bool is_array, reverse_storage_order; int i; /* Temporaries created in the first pass and used in the second one for thin @@ -877,15 +877,19 @@ gnat_get_array_descr_info (const_tree const_type, : array_descr_ordering_row_major); info->rank = NULL_TREE; - /* Count the number of dimensions and determine the element type. */ + /* Count the number of dimensions, determine the element type and whether + it is stored in reverse storage order. */ i = 1; + reverse_storage_order = TYPE_REVERSE_STORAGE_ORDER (first_dimen); dimen = TREE_TYPE (first_dimen); while (TREE_CODE (dimen) == ARRAY_TYPE && TYPE_MULTI_ARRAY_P (dimen)) { i++; + reverse_storage_order = TYPE_REVERSE_STORAGE_ORDER (dimen); dimen = TREE_TYPE (dimen); } info->ndimensions = i; + info->reverse_storage_order = reverse_storage_order; info->element_type = dimen; /* Too many dimensions? Give up generating proper description: yield instead diff --git a/gcc/ada/gcc-interface/trans.cc b/gcc/ada/gcc-interface/trans.cc index 0c2d8685de12..628a1174eca0 100644 --- a/gcc/ada/gcc-interface/trans.cc +++ b/gcc/ada/gcc-interface/trans.cc @@ -2886,7 +2886,8 @@ can_equal_min_or_max_val_p (tree val, tree type, bool max) if (TREE_CODE (min_or_max_val) != INTEGER_CST) return true; - if (TREE_CODE (val) == NOP_EXPR) + if (TREE_CODE (val) == NOP_EXPR + && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (val, 0)))) val = (max ? TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val, 0))) : TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val, 0)))); diff --git a/gcc/ada/gen_il-fields.ads b/gcc/ada/gen_il-fields.ads index 93cfd85ed220..be9778630a54 100644 --- a/gcc/ada/gen_il-fields.ads +++ b/gcc/ada/gen_il-fields.ads @@ -538,6 +538,7 @@ package Gen_IL.Fields is Esize, Extra_Accessibility_Of_Object, Extra_Accessibility_Of_Result, + Extra_Accessibility_Of_Subprogram, Extra_Constrained, Extra_Formal, Extra_Formals, @@ -829,7 +830,6 @@ package Gen_IL.Fields is Materialize_Entity, May_Inherit_Delayed_Rep_Aspects, Mechanism, - Minimum_Accessibility, Modulus, Must_Be_On_Byte_Boundary, Must_Have_Preelab_Init, diff --git a/gcc/ada/gen_il-gen-gen_entities.adb b/gcc/ada/gen_il-gen-gen_entities.adb index 4b73c011b2e5..65fb5dc958f0 100644 --- a/gcc/ada/gen_il-gen-gen_entities.adb +++ b/gcc/ada/gen_il-gen-gen_entities.adb @@ -411,7 +411,6 @@ begin -- Gen_IL.Gen.Gen_Entities Sm (Is_Only_Out_Parameter, Flag), Sm (Linker_Section_Pragma, Node_Id), Sm (Mechanism, Mechanism_Type), - Sm (Minimum_Accessibility, Node_Id), Sm (Protected_Formal, Node_Id), Sm (Spec_Entity, Node_Id), Sm (Unset_Reference, Node_Id))); @@ -456,7 +455,6 @@ begin -- Gen_IL.Gen.Gen_Entities Sm (Associated_Node_For_Itype, Node_Id), Sm (Can_Use_Internal_Rep, Flag, Base_Type_Only, Pre => "Ekind (Base_Type (N)) in Access_Subprogram_Kind"), - Sm (Class_Wide_Equivalent_Type, Node_Id), Sm (Class_Wide_Type, Node_Id), Sm (Contract, Node_Id), Sm (Current_Use_Clause, Node_Id), @@ -511,7 +509,7 @@ begin -- Gen_IL.Gen.Gen_Entities Sm (Is_Generic_Actual_Type, Flag), Sm (Is_Implicit_Full_View, Flag), Sm (Is_Limited_Composite, Flag), - Sm (Is_Mutably_Tagged_Type, Flag), + Sm (Is_Mutably_Tagged_Type, Flag, Base_Type_Only), Sm (Is_Non_Static_Subtype, Flag), Sm (Is_Private_Composite, Flag), Sm (Is_RACW_Stub_Type, Flag), @@ -753,6 +751,7 @@ begin -- Gen_IL.Gen.Gen_Entities Ab (Class_Wide_Kind, Aggregate_Kind, (Sm (C_Pass_By_Copy, Flag, Impl_Base_Type_Only), + Sm (Class_Wide_Equivalent_Type, Node_Id, Base_Type_Only), Sm (Equivalent_Type, Node_Id), Sm (Has_Complex_Representation, Flag, Impl_Base_Type_Only), Sm (Has_Record_Rep_Clause, Flag, Impl_Base_Type_Only), @@ -977,6 +976,7 @@ begin -- Gen_IL.Gen.Gen_Entities Sm (Dynamic_Call_Helper, Node_Id), Sm (Elaboration_Entity, Node_Id), Sm (Elaboration_Entity_Required, Flag), + Sm (Extra_Accessibility_Of_Subprogram, Node_Id), Sm (First_Entity, Node_Id), Sm (Has_Expanded_Contract, Flag), Sm (Has_Nested_Subprogram, Flag), diff --git a/gcc/ada/layout.adb b/gcc/ada/layout.adb index db5d69507fcd..51e68fbc7d64 100644 --- a/gcc/ada/layout.adb +++ b/gcc/ada/layout.adb @@ -497,28 +497,24 @@ package body Layout is Set_Alignment (E, Alignment (Component_Type (E))); end if; - -- If packing was requested, the one-dimensional array is constrained - -- with static bounds, the component size was set explicitly, and - -- the alignment is known, we can set (if not set explicitly) the - -- RM_Size and the Esize of the array type, as RM_Size is equal to - -- (arr'length * arr'component_size) and Esize is the same value - -- rounded to the next multiple of arr'alignment. This is not - -- applicable to packed arrays that are implemented specially - -- in GNAT, i.e. when Packed_Array_Impl_Type is set. + -- For a constrained 1-dimensional array type with known bounds and + -- known component size, we can set (if not already set) the RM_Size + -- and, if the alignment is additionally known, also the Esize of the + -- type, as RM_Size is equal to (Arr'Length * Arr'Component_Size) and + -- Esize is the same value rounded up to a multiple of Arr'Alignment. + -- But this is not applicable to packed arrays that are implemented + -- specially by GNAT, i.e. when Packed_Array_Impl_Type is set. if Is_Array_Type (E) - and then Present (First_Index (E)) -- Skip types in error - and then Number_Dimensions (E) = 1 - and then No (Packed_Array_Impl_Type (E)) - and then Has_Pragma_Pack (E) and then Is_Constrained (E) + and then Number_Dimensions (E) = 1 and then Compile_Time_Known_Bounds (E) and then Known_Component_Size (E) - and then Known_Alignment (E) + and then No (Packed_Array_Impl_Type (E)) then declare - Abits : constant Int := UI_To_Int (Alignment (E)) * SSU; - Lo, Hi : Node_Id; + Hi : Node_Id; + Lo : Node_Id; Siz : Uint; begin @@ -531,8 +527,9 @@ package body Layout is if Compile_Time_Known_Value (Lo) and then Compile_Time_Known_Value (Hi) then - Siz := (Expr_Value (Hi) - Expr_Value (Lo) + 1) - * Component_Size (E); + Siz := + UI_Max (Expr_Value (Hi) - Expr_Value (Lo) + 1, 0) + * Component_Size (E); -- Do not overwrite a different value of 'Size specified -- explicitly by the user. In that case, also do not set @@ -541,9 +538,14 @@ package body Layout is if not Known_RM_Size (E) or else RM_Size (E) = Siz then Set_RM_Size (E, Siz); - if not Known_Esize (E) then - Siz := ((Siz + (Abits - 1)) / Abits) * Abits; - Set_Esize (E, Siz); + if not Known_Esize (E) and then Known_Alignment (E) then + declare + Abits : constant Int := + UI_To_Int (Alignment (E)) * SSU; + begin + Siz := ((Siz + (Abits - 1)) / Abits) * Abits; + Set_Esize (E, Siz); + end; end if; end if; end if; diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb index 678716be8404..589e736b259c 100644 --- a/gcc/ada/libgnat/s-dwalin.adb +++ b/gcc/ada/libgnat/s-dwalin.adb @@ -283,6 +283,10 @@ package body System.Dwarf_Lines is Close (C.Abbrev); Close (C.Info); Close (C.Aranges); + + if C.Has_Line_Str then + Close (C.Line_Str); + end if; end if; Close (C.Obj.all); @@ -516,6 +520,9 @@ package body System.Dwarf_Lines is if Line_Str /= Null_Section then C.Line_Str := Create_Stream (C.Obj.all, Line_Str); + C.Has_Line_Str := True; + else + C.Has_Line_Str := False; end if; -- All operations are successful, context is valid diff --git a/gcc/ada/libgnat/s-dwalin.ads b/gcc/ada/libgnat/s-dwalin.ads index 3b7087f5a926..936389e0046f 100644 --- a/gcc/ada/libgnat/s-dwalin.ads +++ b/gcc/ada/libgnat/s-dwalin.ads @@ -192,6 +192,9 @@ private Has_Debug : Boolean; -- True if all debug sections are available + Has_Line_Str : Boolean; + -- True if the .debug_line_str section is available + Cache : Search_Array_Access; -- Quick access to symbol and debug info (when present). diff --git a/gcc/ada/libgnat/s-objrea.adb b/gcc/ada/libgnat/s-objrea.adb index 255ddde4a98a..2223697c016d 100644 --- a/gcc/ada/libgnat/s-objrea.adb +++ b/gcc/ada/libgnat/s-objrea.adb @@ -82,6 +82,7 @@ package body System.Object_Reader is EM_X86_64 : constant := 62; -- AMD x86-64 architecture EM_AARCH64 : constant := 183; -- Aarch64 EM_RISCV : constant := 243; -- RISC-V + EM_LOONGARCH : constant := 258; -- LoongArch EN_NIDENT : constant := 16; @@ -657,6 +658,9 @@ package body System.Object_Reader is when EM_RISCV => Res.Arch := RISCV; + when EM_LOONGARCH => + Res.Arch := LOONGARCH; + when others => raise Format_Error with "unrecognized architecture"; end case; @@ -2081,7 +2085,7 @@ package body System.Object_Reader is Address_64 := Read (S); return Address_64; - when RISCV | S390 => + when RISCV | S390 | LOONGARCH => case Obj.Format is when ELF32 => Address_32 := Read (S); diff --git a/gcc/ada/libgnat/s-objrea.ads b/gcc/ada/libgnat/s-objrea.ads index 88bf21629c31..b044946fabb6 100644 --- a/gcc/ada/libgnat/s-objrea.ads +++ b/gcc/ada/libgnat/s-objrea.ads @@ -129,9 +129,12 @@ package System.Object_Reader is AARCH64, -- 64-bit ARM - RISCV); + RISCV, -- RISC-V + LOONGARCH); + -- LoongArch + ------------------ -- Target types -- ------------------ diff --git a/gcc/ada/mutably_tagged.adb b/gcc/ada/mutably_tagged.adb index 971e9de95286..446b7405032d 100644 --- a/gcc/ada/mutably_tagged.adb +++ b/gcc/ada/mutably_tagged.adb @@ -186,13 +186,13 @@ package body Mutably_Tagged is and then not Error_Posted (Typ) -- Finally check Typ is a class-wide equivalent type which has an - -- associated mutably tagged class-wide type (e.g. it is a class-wide - -- type with a size clause). + -- associated mutably tagged class-wide type. and then Is_Class_Wide_Equivalent_Type (Typ) and then Present (Parent_Subtype (Typ)) and then Present (Class_Wide_Type (Parent_Subtype (Typ))) - and then Has_Size_Clause (Corresponding_Mutably_Tagged_Type (Typ)); + and then + Is_Mutably_Tagged_Type (Class_Wide_Type (Parent_Subtype (Typ))); end Is_Mutably_Tagged_CW_Equivalent_Type; -------------------------------- diff --git a/gcc/ada/mutably_tagged.ads b/gcc/ada/mutably_tagged.ads index 2ffc3ce824c8..7c6c2f44b4d3 100644 --- a/gcc/ada/mutably_tagged.ads +++ b/gcc/ada/mutably_tagged.ads @@ -77,12 +77,11 @@ package Mutably_Tagged is function Get_Corresponding_Tagged_Type_If_Present (Typ : Entity_Id) return Entity_Id; - -- Obtain the corresponding tag type associated with Typ when - -- Typ is a mutably tagged class-wide equivalent type. Otherwise, Just - -- return Typ. + -- Obtain the corresponding tagged type associated with Typ when Typ is + -- a mutably tagged class-wide equivalent type. Otherwise, just return Typ. -- This function is mostly used when we need a concrete type to generate - -- initialization for mutably tagged types. + -- initialization/adjustment/finalization for mutably tagged types. function Is_Mutably_Tagged_Conversion (N : Node_Id) return Boolean; -- Return True if expression N is an object of a mutably tagged class-wide diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index 1d39bd7d8456..ba65c193845f 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -5507,10 +5507,10 @@ package body Sem_Aggr is -- ancestor part. -- -- If the aggregate is in a context with expansion delayed, it will be - -- reanalyzed. The inherited discriminant values must not be reinserted - -- in the component list to prevent spurious errors, but they must be - -- present on first analysis to build the proper subtype indications. - -- The flag Inherited_Discriminant is used to prevent the re-insertion. + -- reanalyzed. The inherited discriminant values must not be present in + -- the component list the second time to prevent spurious errors and, + -- therefore, need to be removed at the end of the first processing. + -- The flag Inherited_Discriminant is used to implement this scheme. function Find_Private_Ancestor (Typ : Entity_Id) return Entity_Id; -- AI05-0115: Find earlier ancestor in the derivation chain that is @@ -5599,40 +5599,20 @@ package body Sem_Aggr is -------------------------- function Discriminant_Present (Input_Discr : Entity_Id) return Boolean is - Regular_Aggr : constant Boolean := Nkind (N) /= N_Extension_Aggregate; - + Ancestor : Node_Id; Ancestor_Is_Subtyp : Boolean; - - Loc : Source_Ptr; - - Ancestor : Node_Id; - Ancestor_Typ : Entity_Id; - Comp_Assoc : Node_Id; - Discr : Entity_Id; - Discr_Expr : Node_Id; - Discr_Val : Elmt_Id := No_Elmt; - Orig_Discr : Entity_Id; + Ancestor_Typ : Entity_Id; + Discr : Entity_Id; + Discr_Expr : Node_Id; + Discr_Val : Elmt_Id; + Loc : Source_Ptr; + Orig_Discr : Entity_Id; begin - if Regular_Aggr then + if Nkind (N) /= N_Extension_Aggregate then return True; end if; - -- Check whether inherited discriminant values have already been - -- inserted in the aggregate. This will be the case if we are - -- re-analyzing an aggregate whose expansion was delayed. - - if Present (Component_Associations (N)) then - Comp_Assoc := First (Component_Associations (N)); - while Present (Comp_Assoc) loop - if Inherited_Discriminant (Comp_Assoc) then - return True; - end if; - - Next (Comp_Assoc); - end loop; - end if; - Ancestor := Ancestor_Part (N); Ancestor_Typ := Etype (Ancestor); Loc := Sloc (Ancestor); @@ -6982,7 +6962,24 @@ package body Sem_Aggr is Step_8 : declare New_Aggregate : constant Node_Id := New_Copy (N); + Assoc : Node_Id; + Next_Assoc : Node_Id; + begin + -- If this is an extension aggregate, remove the inherited + -- discriminants from the list in case it is reanalyzed. + + if Nkind (N) = N_Extension_Aggregate then + Assoc := First (New_Assoc_List); + while Present (Assoc) loop + Next_Assoc := Next (Assoc); + if Inherited_Discriminant (Assoc) then + Remove (Assoc); + end if; + Assoc := Next_Assoc; + end loop; + end if; + Set_Expressions (New_Aggregate, No_List); Set_Etype (New_Aggregate, Etype (N)); Set_Component_Associations (New_Aggregate, New_Assoc_List); diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index c61761edca83..2814c2c1a895 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -914,20 +914,23 @@ package body Sem_Attr is ("prefix of % attribute cannot be enumeration literal"); end if; - -- Preserve relevant elaboration-related attributes of the context - -- which are no longer available or very expensive to recompute once - -- analysis, resolution, and expansion are over. + if Nkind (N) not in N_Raise_xxx_Error then - Mark_Elaboration_Attributes - (N_Id => N, - Checks => True, - Modes => True, - Warnings => True); + -- Preserve relevant elaboration-related attributes of the context + -- which are no longer available or very expensive to recompute + -- once analysis, resolution, and expansion are over. - -- Save the scenario for later examination by the ABE Processing - -- phase. + Mark_Elaboration_Attributes + (N_Id => N, + Checks => True, + Modes => True, + Warnings => True); - Record_Elaboration_Scenario (N); + -- Save the scenario for later examination by the ABE Processing + -- phase. + + Record_Elaboration_Scenario (N); + end if; -- Case of access to subprogram @@ -12208,11 +12211,12 @@ package body Sem_Attr is and then (Ekind (Btyp) = E_Access_Subprogram_Type or else Is_Local_Anonymous_Access (Btyp)) - and then Subprogram_Access_Level (Entity (P)) > - Type_Access_Level (Btyp) + and then Static_Subprogram_Access_Level (Entity (P)) + > Static_Type_Access_Level (Btyp) then Error_Msg_F - ("subprogram must not be deeper than access type", P); + ("nonlocal access value cannot designate local" + & " subprogram (RM 3.10.2(32))", P); -- Check the restriction of 3.10.2(32) that disallows the -- access attribute within a generic body when the ultimate @@ -12266,8 +12270,8 @@ package body Sem_Attr is and then Enclosing_Generic_Body (N) /= Enclosing_Generic_Body (Enclosing_Generic_Unit (Entity (P))) - and then Subprogram_Access_Level (Entity (P)) = - Type_Access_Level (Btyp) + and then Static_Subprogram_Access_Level (Entity (P)) = + Static_Type_Access_Level (Btyp) and then Ekind (Btyp) /= E_Anonymous_Access_Subprogram_Type and then Ekind (Btyp) /= @@ -12667,8 +12671,8 @@ package body Sem_Attr is or else No_Dynamic_Acc_Checks) and then - Static_Accessibility_Level (P, Zero_On_Dynamic_Level) - > Deepest_Type_Access_Level (Btyp) + Static_Accessibility_Level (P) + > Static_Type_Access_Level (Btyp, Deepest => True) then Accessibility_Message (N, Typ); end if; @@ -12688,8 +12692,8 @@ package body Sem_Attr is -- anonymous_access_to_protected, there are no accessibility -- checks either. Omit check entirely for Unrestricted_Access. - elsif Static_Accessibility_Level (P, Zero_On_Dynamic_Level) - > Deepest_Type_Access_Level (Btyp) + elsif Static_Accessibility_Level (P) + > Static_Type_Access_Level (Btyp, Deepest => True) and then Comes_From_Source (N) and then Ekind (Btyp) = E_Access_Protected_Subprogram_Type and then Attr_Id /= Attribute_Unrestricted_Access diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index a87dde1868bd..ba757e766c8f 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -15720,8 +15720,8 @@ package body Sem_Ch12 is Gen_T); elsif not Is_Definite_Subtype (Act_T) + and then not Is_Mutably_Tagged_Type (Act_T) and then Is_Definite_Subtype (A_Gen_T) - and then No (Class_Wide_Equivalent_Type (Act_T)) and then Ada_Version >= Ada_95 then Error_Msg_NE @@ -15763,10 +15763,10 @@ package body Sem_Ch12 is Act_T := Entity (Actual); - -- Obtain the class-wide equivalent type and use it for the + -- Obtain the class-wide equivalent type, if any, and use it for the -- instantiation instead of a mutably tagged type. - if Present (Class_Wide_Equivalent_Type (Act_T)) then + if Is_Mutably_Tagged_Type (Act_T) then Act_T := Class_Wide_Equivalent_Type (Act_T); end if; diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index b2845814d306..837f662b7b45 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -7350,6 +7350,25 @@ package body Sem_Ch13 is Set_Biased (New_Ctyp, N, "component size clause"); end if; + -- If a different component size has been inherited and + -- no clause size has been given, then reset the size. + + if Known_Component_Size (Btype) + and then Component_Size (Btype) /= Csize + then + if Known_RM_Size (U_Ent) + and then not Has_Size_Clause (U_Ent) + then + Set_RM_Size (U_Ent, No_Uint); + end if; + + if Known_Esize (U_Ent) + and then not Has_Object_Size_Clause (U_Ent) + then + Set_Esize (U_Ent, No_Uint); + end if; + end if; + Set_Component_Size (Btype, Csize); -- Deal with warning on overridden size @@ -8145,13 +8164,13 @@ package body Sem_Ch13 is -- check (B) - if Type_Access_Level (Ent) + if Static_Type_Access_Level (Ent) > Static_Accessibility_Level - (Pool, Object_Decl_Level) + (Pool, Object_Decl_Level => True) then Error_Msg_N ("subpool access type has deeper accessibility " - & "level than pool", Ent); + & "level than pool (RM 13.11.4(23))", Ent); return; end if; @@ -17338,34 +17357,21 @@ package body Sem_Ch13 is Dummy : Traverse_Result; begin - if Nkind (N) = N_Selected_Component then - if Nkind (Prefix (N)) = N_Identifier - and then Chars (Prefix (N)) /= Chars (E) - then - Find_Selected_Component (N); - - -- Reset the Entity if N is overloaded since the entity might - -- not be the correct one; allow later resolution to set it - -- properly. - - if Is_Overloaded (N) then - Set_Entity (N, Empty); - end if; - end if; + -- Resolve identifiers that are not selector names, because the + -- latter are not resolved by visibility. - return Skip; - - -- Resolve identifiers, but not selectors in parameter associations; - -- such selectors are never resolved by visibility. - - elsif Nkind (N) = N_Identifier + if Nkind (N) = N_Identifier and then Chars (N) /= Chars (E) - and then (Nkind (Parent (N)) /= N_Parameter_Association - or else N /= Selector_Name (Parent (N))) + and then not (Nkind (Parent (N)) in N_Expanded_Name + | N_Generic_Association + | N_Parameter_Association + | N_Selected_Component + and then N = Selector_Name (Parent (N))) then Find_Direct_Name (N); - -- Reset the Entity as above for selected_components + -- Reset Entity if N is overloaded, since the entity might not + -- be the correct one, to allow resolution to set it properly. if Is_Overloaded (N) then Set_Entity (N, Empty); @@ -17377,6 +17383,8 @@ package body Sem_Ch13 is Dummy := Resolve_Name (Expression (N)); return Skip; + -- See above for the rationale + elsif Nkind (N) = N_Quantified_Expression then return Skip; end if; diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 293f3376039a..504d77ce03b3 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -2142,15 +2142,15 @@ package body Sem_Ch3 is ("access to specific tagged type required (RM 3.9.2(9))", E); end if; - -- (Ada 2005: AI-230): Accessibility check for anonymous + -- Ada 2005 (AI-230): Accessibility check for anonymous -- components - if Type_Access_Level (Etype (E)) > - Deepest_Type_Access_Level (T) + if Static_Type_Access_Level (Etype (E)) + > Static_Type_Access_Level (T, Deepest => True) then Error_Msg_N - ("expression has deeper access level than component " & - "(RM 3.10.2 (12.2))", E); + ("expression has deeper accessibility level than component" + & " (RM 3.10.2(12.2))", E); end if; -- The initialization expression is a reference to an access @@ -2163,8 +2163,8 @@ package body Sem_Ch3 is and then Present (Discriminal_Link (Entity (E))) then Error_Msg_N - ("discriminant has deeper accessibility level than target", - E); + ("access discriminant has deeper accessibility level than" + & " component (RM 3.10.2(12.2))", E); end if; end if; end if; @@ -2320,12 +2320,6 @@ package body Sem_Ch3 is -- contract expression. Full analysis of the expression is done when -- the contract is processed. - function Contains_Lib_Incomplete_Type (Pkg : Entity_Id) return Boolean; - -- Check if a nested package has entities within it that rely on library - -- level private types where the full view has not been completed for - -- the purposes of checking if it is acceptable to freeze an expression - -- function at the point of declaration. - procedure Handle_Late_Controlled_Primitive (Body_Decl : Node_Id); -- Determine whether Body_Decl denotes the body of a late controlled -- primitive (either Initialize, Adjust or Finalize). If this is the @@ -2529,40 +2523,6 @@ package body Sem_Ch3 is end loop; end Check_Entry_Contracts; - ---------------------------------- - -- Contains_Lib_Incomplete_Type -- - ---------------------------------- - - function Contains_Lib_Incomplete_Type (Pkg : Entity_Id) return Boolean is - Curr : Entity_Id; - - begin - -- Avoid looking through scopes that do not meet the precondition of - -- Pkg not being within a library unit spec. - - if not Is_Compilation_Unit (Pkg) - and then not Is_Generic_Instance (Pkg) - and then not In_Package_Body (Enclosing_Lib_Unit_Entity (Pkg)) - then - -- Loop through all entities in the current scope to identify - -- an entity that depends on a private type. - - Curr := First_Entity (Pkg); - loop - if Nkind (Curr) in N_Entity - and then Depends_On_Private (Curr) - then - return True; - end if; - - exit when Last_Entity (Current_Scope) = Curr; - Next_Entity (Curr); - end loop; - end if; - - return False; - end Contains_Lib_Incomplete_Type; - -------------------------------------- -- Handle_Late_Controlled_Primitive -- -------------------------------------- @@ -2806,10 +2766,6 @@ package body Sem_Ch3 is Check_Entry_Contracts; elsif Nkind (Parent (L)) /= N_Package_Specification then - if Nkind (Parent (L)) = N_Package_Body then - Freeze_From := First_Entity (Current_Scope); - end if; - -- There may have been several freezing points previously, -- for example object declarations or subprogram bodies, but -- at the end of a declarative part we check freezing from @@ -2881,7 +2837,7 @@ package body Sem_Ch3 is Resolve_Aspects; end if; - -- If next node is a body then freeze all types before the body. + -- If next node is a body, then freeze all entities before the body. -- An exception occurs for some expander-generated bodies. If these -- are generated at places where in general language rules would not -- allow a freeze point, then we assume that the expander has @@ -2892,25 +2848,11 @@ package body Sem_Ch3 is -- In all other cases (bodies that come from source, and expander -- generated bodies that have not been analyzed yet), freeze all - -- types now. Note that in the latter case, the expander must take - -- care to attach the bodies at a proper place in the tree so as to - -- not cause unwanted freezing at that point. The exception is the - -- generated body of an expression function, which does not freeze. - - -- It is also necessary to check for a case where both an expression - -- function is used and the current scope depends on an incomplete - -- private type from a library unit, otherwise premature freezing of - -- the private type will occur. - - elsif not Analyzed (Next_Decl) - and then Is_Body (Next_Decl) - and then ((Nkind (Next_Decl) /= N_Subprogram_Body - or else not Was_Expression_Function (Next_Decl)) - or else (not Is_Ignored_Ghost_Entity_In_Codegen - (Current_Scope) - and then not Contains_Lib_Incomplete_Type - (Current_Scope))) - then + -- entities now. Note that in the latter case, the expander must + -- take care to attach the bodies at a proper place in the tree, + -- so as not to cause unwanted freezing at that point. + + elsif Is_Body (Next_Decl) and then not Analyzed (Next_Decl) then -- When a controlled type is frozen, the expander generates stream -- and controlled-type support routines. If the freeze is caused -- by the stand-alone body of Initialize, Adjust, or Finalize, the @@ -8767,8 +8709,6 @@ package body Sem_Ch3 is -- In any case, the primitive operations are inherited from the -- parent type, not from the internal full view. - Set_Etype (Base_Type (Derived_Type), Base_Type (Parent_Type)); - if Derive_Subps then -- Initialize the list of primitive operations to an empty list, -- to cover tagged types as well as untagged types. For untagged @@ -8780,12 +8720,13 @@ package body Sem_Ch3 is Derive_Subprograms (Parent_Type, Derived_Type); end if; + Set_Has_Constrained_Partial_View + (Derived_Type, Has_Constrained_Partial_View (Par_Base)); + Set_Is_Constrained (Derived_Type, Is_Constrained (Parent_Type)); Set_Stored_Constraint (Derived_Type, No_Elist); - Set_Is_Constrained - (Derived_Type, Is_Constrained (Available_Full_View (Parent_Type))); else - -- Untagged type, No discriminants on either view + -- Untagged type, no discriminants on either view if Nkind (Subtype_Indication (Type_Definition (N))) = N_Subtype_Indication @@ -9820,31 +9761,37 @@ package body Sem_Ch3 is if Ada_Version >= Ada_2005 then Check_Generic_Ancestors; - elsif Type_Access_Level (Derived_Type) /= - Type_Access_Level (Parent_Type) + -- In Ada 95, the accessibility level of a record extension cannot + -- be deeper than that of its parent type. + + elsif Static_Type_Access_Level (Derived_Type) + > Static_Type_Access_Level (Parent_Type) and then not Is_Generic_Type (Derived_Type) then if Is_Controlled (Parent_Type) then Error_Msg_N - ("controlled type must be declared at the library level", - Indic); + ("controlled type must be declared at the library level" + & " (RM 3.9.1(3))", Indic); else Error_Msg_N - ("type extension at deeper accessibility level than parent", - Indic); + ("type extension at deeper accessibility level than parent" + & " (RM 3.9.1(3))", Indic); end if; + -- In Ada 95, a type extension cannot be declared in a generic body + -- if the parent type is declared outside that body. + else declare GB : constant Node_Id := Enclosing_Generic_Body (Derived_Type); + begin if Present (GB) and then GB /= Enclosing_Generic_Body (Parent_Base) then Error_Msg_NE ("parent type of& must not be outside generic body" - & " (RM 3.9.1(4))", - Indic, Derived_Type); + & " (RM 3.9.1(4))", Indic, Derived_Type); end if; end; end if; @@ -10127,6 +10074,8 @@ package body Sem_Ch3 is Propagate_Concurrent_Flags (Derived_Type, Parent_Base); Propagate_Controlled_Flags (Derived_Type, Parent_Base, Deriv => True); + Set_Has_Constrained_Partial_View + (Derived_Type, Has_Constrained_Partial_View (Parent_Base)); Set_Has_Non_Standard_Rep (Derived_Type, Has_Non_Standard_Rep (Parent_Base)); Set_Has_Primitive_Operations @@ -18422,8 +18371,9 @@ package body Sem_Ch3 is -- of the type. if Scope (Root_Class_Typ) /= Scope (T) - and then Deepest_Type_Access_Level (Root_Class_Typ) - < Deepest_Type_Access_Level (T) + and then + Static_Type_Access_Level (Root_Class_Typ, Deepest => True) + < Static_Type_Access_Level (T) then Error_Msg_NE ("descendant of mutably tagged type cannot be deeper than" @@ -18923,7 +18873,6 @@ package body Sem_Ch3 is Set_Full_View (Prev, Id); Append_Entity (Id, Current_Scope); Set_Is_Public (Id, Is_Public (Prev)); - Set_Is_Internal (Id); New_Id := Prev; -- If the incomplete view is tagged, a class_wide type has been @@ -23493,8 +23442,8 @@ package body Sem_Ch3 is procedure Record_Type_Definition (Def : Node_Id; Prev_T : Entity_Id) is Component : Entity_Id; - Final_Storage_Only : Boolean := True; - Relaxed_Finalization : Boolean := True; + Final_Storage_Only : Boolean; + Relaxed_Finalization : Boolean; T : Entity_Id; begin @@ -23504,6 +23453,17 @@ package body Sem_Ch3 is T := Prev_T; end if; + -- Initialize Final_Storage_Only and Relaxed_Finalization from the + -- current state if we have inherited controlled components. + + if Has_Controlled_Component (T) then + Final_Storage_Only := Finalize_Storage_Only (T); + Relaxed_Finalization := Has_Relaxed_Finalization (T); + else + Final_Storage_Only := True; + Relaxed_Finalization := True; + end if; + Set_Is_Not_Self_Hidden (T); -- Ada 2005: Check whether an explicit "limited" is present in a derived @@ -23568,13 +23528,12 @@ package body Sem_Ch3 is if Ekind (Component) /= E_Component then null; - -- Do not set Has_Controlled_Component on a class-wide equivalent - -- type. See Make_CW_Equivalent_Type. + -- Do not set Has_Controlled_Component on a CW equivalent type, + -- see Exp_Util.Make_CW_Equivalent_Type. elsif not Is_Class_Wide_Equivalent_Type (T) - and then (Has_Controlled_Component (Etype (Component)) - or else (Chars (Component) /= Name_uParent - and then Is_Controlled (Etype (Component)))) + and then Chars (Component) /= Name_uParent + and then Needs_Finalization (Etype (Component)) then Set_Has_Controlled_Component (T); Final_Storage_Only := @@ -23591,7 +23550,7 @@ package body Sem_Ch3 is -- For a type that is not directly controlled but has controlled -- components, Finalize_Storage_Only is set if all the controlled -- components are Finalize_Storage_Only. The same processing is - -- appled to Has_Relaxed_Finalization. + -- applied to Has_Relaxed_Finalization. if not Is_Controlled (T) and then Has_Controlled_Component (T) then Set_Finalize_Storage_Only (T, Final_Storage_Only); diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 400fa4f8869f..07bedd0fb761 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -3683,7 +3683,7 @@ package body Sem_Ch4 is Analyze (N); return; - else + elsif Nkind (R) not in N_Raise_xxx_Error then -- In all versions of the language, if we reach this point there -- is a previous error that will be diagnosed below. @@ -11440,10 +11440,6 @@ package body Sem_Ch4 is E : Elmt_Id; begin - if not Is_Tagged_Type (T) then - return; - end if; - E := First_Elmt (Primitive_Operations (Base_Type (T))); while Present (E) loop Op := Node (E); diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index a2028768c403..80bc657eadea 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -443,7 +443,7 @@ package body Sem_Ch6 is -- with the function body. Ghost_Context_Checks_Disabled := True; - Freeze_Expr_Types_Before + Freeze_Full_Expression_Before (N => N, Expr => Expr, Def_Id => Def_Id, @@ -712,6 +712,7 @@ package body Sem_Ch6 is if Present (Def_Id) and then Is_Tagged_Type (Typ) + and then not Error_Posted (N) then Check_Dynamically_Tagged_Expression (Expr => Expr, @@ -1093,17 +1094,15 @@ package body Sem_Ch6 is -- If the result type is class-wide, then check that the return -- expression's type is not declared at a deeper level than the - -- function (RM05-6.5(5.6/2)). + -- function (RM 6.5(5.8)). - if Ada_Version >= Ada_2005 - and then Is_Class_Wide_Type (R_Type) - then - if Type_Access_Level (Etype (Expr)) > - Subprogram_Access_Level (Scope_Id) + if Ada_Version >= Ada_2005 and then Is_Class_Wide_Type (R_Type) then + if Static_Type_Access_Level (Etype (Expr)) + > Static_Subprogram_Access_Level (Scope_Id) then Error_Msg_N - ("level of return expression type is deeper than " - & "class-wide function!", Expr); + ("type of return expression has deeper accessibility level" + & " than class-wide function (RM 6.5(5.8))", Expr); end if; end if; @@ -1116,14 +1115,13 @@ package body Sem_Ch6 is Related_Nod => N); end if; - -- Perform static accessibility checks for cases involving - -- dereferences of access parameters. Runtime accessibility checks - -- get generated elsewhere. + -- Perform a static accessibility check for return-by-reference + -- of limited types in Ada 95 or if -gnatd.l is in effect. if (Ada_Version < Ada_2005 or else Debug_Flag_Dot_L) and then Is_Inherently_Limited_Type (Etype (Scope_Id)) - and then Static_Accessibility_Level (Expr, Zero_On_Dynamic_Level) - > Subprogram_Access_Level (Scope_Id) + and then Static_Accessibility_Level (Expr) + > Static_Subprogram_Access_Level (Scope_Id) then -- Suppress the message in a generic, where the rewriting -- is irrelevant. @@ -1154,16 +1152,16 @@ package body Sem_Ch6 is Reason => CE_Null_Not_Allowed); end if; - -- RM 6.5 (5.4/3): accessibility checks also apply if the return object - -- has no initializing expression. + -- The above accessibility check in Ada 2005 also applies if the return + -- object has no initializing expression (RM 6.5(5.5)). elsif Ada_Version > Ada_2005 and then Is_Class_Wide_Type (R_Type) then - if Type_Access_Level (Etype (Defining_Identifier (Obj_Decl))) > - Subprogram_Access_Level (Scope_Id) + if Static_Type_Access_Level (Etype (Defining_Identifier (Obj_Decl))) + > Static_Subprogram_Access_Level (Scope_Id) then Error_Msg_N - ("level of return expression type is deeper than " - & "class-wide function!", Obj_Decl); + ("type of return object has deeper accessibility level" + & " than class-wide function (RM 6.5(5.5))", Obj_Decl); end if; end if; end Analyze_Function_Return; @@ -2398,7 +2396,7 @@ package body Sem_Ch6 is -- means that it is equivalent to Is_Expression_Function_Or_Completion -- invoked on Spec_Id declared below and not to Is_Expression_Function. - Acc_Objs : List_Id := No_List; + Acc_Decl : Node_Id := Empty; Desig_View : Entity_Id := Empty; Exch_Views : Elist_Id := No_Elist; Prot_Typ : Entity_Id := Empty; @@ -2464,6 +2462,13 @@ package body Sem_Ch6 is -- Checks for a function with a no return statements, and also performs -- the warning checks implemented by Check_Returns. + procedure Compute_Extra_Accessibility + (Subp_Id : Entity_Id; + Extra_Access_Id : Entity_Id); + -- Update the value of the Extra_Accessibility_Of_Subprogram object of + -- Subp_Id given the value of an Extra_Accessibility formal by taking + -- the maximum of the two values. + function Disambiguate_Spec return Entity_Id; -- When a primitive is declared between the private view and the full -- view of a concurrent type which implements an interface, a special @@ -2476,13 +2481,6 @@ package body Sem_Ch6 is -- limited views with the non-limited ones. Return the list of changes -- to be used to undo the transformation. - procedure Generate_Minimum_Accessibility - (Extra_Access : Entity_Id; - Related_Form : Entity_Id := Empty); - -- Generate a minimum accessibility object for a given extra - -- accessibility formal (Extra_Access) and its related formal if it - -- exists. - function Is_Private_Concurrent_Primitive (Subp_Id : Entity_Id) return Boolean; -- Determine whether subprogram Subp_Id is a primitive of a concurrent @@ -3052,6 +3050,41 @@ package body Sem_Ch6 is end if; end Check_Missing_Return; + --------------------------------- + -- Compute_Extra_Accessibility -- + --------------------------------- + + procedure Compute_Extra_Accessibility + (Subp_Id : Entity_Id; + Extra_Access_Id : Entity_Id) + is + Acc_Id : Entity_Id; + + begin + if Present (Extra_Accessibility_Of_Subprogram (Subp_Id)) then + Set_Expression (Acc_Decl, + Make_Attribute_Reference (Loc, + Prefix => New_Occurrence_Of (Standard_Natural, Loc), + Attribute_Name => Name_Max, + Expressions => New_List ( + New_Occurrence_Of (Extra_Access_Id, Loc), + Expression (Acc_Decl)))); + + else + Acc_Id := Make_Temporary (Loc, 'A', Extra_Access_Id); + Acc_Decl := + Make_Object_Declaration (Loc, + Defining_Identifier => Acc_Id, + Constant_Present => True, + Object_Definition => + New_Occurrence_Of (Standard_Natural, Loc), + Expression => + New_Occurrence_Of (Extra_Access_Id, Loc)); + + Set_Extra_Accessibility_Of_Subprogram (Subp_Id, Acc_Id); + end if; + end Compute_Extra_Accessibility; + ----------------------- -- Disambiguate_Spec -- ----------------------- @@ -3225,60 +3258,6 @@ package body Sem_Ch6 is return Result; end Exchange_Limited_Views; - ------------------------------------ - -- Generate_Minimum_Accessibility -- - ------------------------------------ - - procedure Generate_Minimum_Accessibility - (Extra_Access : Entity_Id; - Related_Form : Entity_Id := Empty) - is - Loc : constant Source_Ptr := Sloc (N); - - Decl : Node_Id; - Form : Entity_Id; - - begin - -- When no related formal exists then we are dealing with an - -- extra accessibility formal for a function result. - - if No (Related_Form) then - Form := Extra_Access; - else - Form := Related_Form; - end if; - - -- Declare the minimum accessibility object - - Decl := - Make_Object_Declaration (Loc, - Defining_Identifier => Make_Temporary (Loc, 'A', Extra_Access), - Object_Definition => New_Occurrence_Of (Standard_Natural, Loc), - Expression => - Make_Attribute_Reference (Loc, - Prefix => New_Occurrence_Of (Standard_Natural, Loc), - Attribute_Name => Name_Min, - Expressions => New_List ( - Make_Integer_Literal (Loc, Scope_Depth (Body_Id)), - New_Occurrence_Of (Extra_Access, Loc)))); - - -- Add the new local object to the Minimum_Acc_Obj to be later - -- prepended to the subprogram's list of declarations after we - -- are sure all expansion is done. - - if Present (Acc_Objs) then - Prepend (Decl, Acc_Objs); - else - Acc_Objs := New_List (Decl); - end if; - - -- Register the object and analyze it - - Set_Minimum_Accessibility (Form, Defining_Identifier (Decl)); - - Analyze (Decl); - end Generate_Minimum_Accessibility; - ------------------------------------- -- Is_Private_Concurrent_Primitive -- ------------------------------------- @@ -4437,69 +4416,60 @@ package body Sem_Ch6 is end; end if; - -- Generate minimum accessibility local objects to correspond with - -- any extra formal added for anonymous access types. This new local - -- object can then be used instead of the formal in case it is used - -- in an actual to a call to a nested subprogram. - - -- This method is used to supplement our "small integer model" for - -- accessibility check generation (for more information see - -- Accessibility_Level). - - -- Because we allow accessibility values greater than our expected value - -- passing along the same extra accessibility formal as an actual - -- to a nested subprogram becomes a problem because high values mean - -- different things to the callee even though they are the same to the - -- caller. So, as described in the first section, we create a local - -- object representing the minimum of the accessibility level value that - -- is passed in and the accessibility level of the callee's parameter - -- and locals and use it in the case of a call to a nested subprogram. - -- This generated object is referred to as a "minimum accessibility - -- level." - - -- Loop through formals if the subprogram is capable of accepting - -- a generated local object. If it is not, then it is also not - -- capable of having local subprograms meaning it would not need - -- a minimum accessibility level object anyway. - - if Has_Declarations (N) then + -- Compute the value of the Extra_Accessibility_Of_Subprogram object if + -- there are extra formals added for anonymous access types. This value + -- is used as an offset in the computation of the dynamic accessibility + -- level of the entities declared in the subprogram. + + -- This method supplements our "small integer" model for the generation + -- of dynamic accessibility checks. It ensures that the local objects of + -- the subprogram have a deeper dynamic accessibility level than any of + -- the nonlocal objects the subprogram may access indirectly. + + if Nkind (N) = N_Subprogram_Body + and then not No_Dynamic_Accessibility_Checks_Enabled (N) + and then (No (Spec_Id) + or else No (Extra_Accessibility_Of_Subprogram (Spec_Id))) + then declare Subp_Id : constant Entity_Id := Subprogram_Entity; + Par_Id : constant Entity_Id := Enclosing_Subprogram (Subp_Id); Formal : Node_Id; begin Formal := First_Formal (Subp_Id); while Present (Formal) loop - -- Generate the minimum accessibility level object: - - -- Ann : constant natural := natural'min(1, paramL); - - if Present (Extra_Accessibility (Formal)) then - Generate_Minimum_Accessibility - (Extra_Accessibility (Formal), Formal); + if Present (Extra_Accessibility_Of_Object (Formal)) then + Compute_Extra_Accessibility + (Subp_Id, Extra_Accessibility_Of_Object (Formal)); end if; Next_Formal (Formal); end loop; - -- Generate the minimum accessibility level object for the - -- function's Extra_Accessibility_Of_Result: - - -- Ann : constant natural := natural'min (1, funcL); - if Ekind (Subp_Id) = E_Function and then Present (Extra_Accessibility_Of_Result (Subp_Id)) then - Generate_Minimum_Accessibility - (Extra_Accessibility_Of_Result (Subp_Id)); + Compute_Extra_Accessibility + (Subp_Id, Extra_Accessibility_Of_Result (Subp_Id)); + end if; + + -- For nested subprograms present in the source code, also take + -- into account the extra accessibility of the parent; generated + -- subprograms are not supposed to perform accessibility checks. - -- Replace the Extra_Accessibility_Of_Result with the new - -- minimum accessibility object. + if Comes_From_Source (Subp_Id) + and then Present (Par_Id) + and then Present (Extra_Accessibility_Of_Subprogram (Par_Id)) + then + Compute_Extra_Accessibility + (Subp_Id, Extra_Accessibility_Of_Subprogram (Par_Id)); + end if; - Set_Extra_Accessibility_Of_Result - (Subp_Id, Minimum_Accessibility - (Extra_Accessibility_Of_Result (Subp_Id))); + if Present (Acc_Decl) then + Prepend_To (Declarations (N), Acc_Decl); + Analyze (Acc_Decl); end if; end; end if; @@ -4645,11 +4615,6 @@ package body Sem_Ch6 is Inspect_Deferred_Constant_Completion (Declarations (N)); Analyze (Handled_Statement_Sequence (N)); - -- Prepend the declaration of minimum accessibility objects to the list - -- of declarations after analysis of the statements and contracts. - - Prepend_List (Acc_Objs, Declarations (N)); - -- Deal with end of scope processing for the body Process_End_Label @@ -4685,23 +4650,6 @@ package body Sem_Ch6 is end if; end if; - -- Restore the Extra_Accessibility_Of_Result object that was clobbered - -- earlier, so that the name of the local temporary does not leak. - - if Has_Declarations (N) then - declare - Subp_Id : constant Entity_Id := Subprogram_Entity; - - begin - if Ekind (Subp_Id) = E_Function - and then Present (Extra_Accessibility_Of_Result (Subp_Id)) - then - Set_Extra_Accessibility_Of_Result (Subp_Id, - Related_Expression (Extra_Accessibility_Of_Result (Subp_Id))); - end if; - end; - end if; - -- If we are compiling an entry wrapper, remove the enclosing -- synchronized object from the stack. @@ -8902,14 +8850,14 @@ package body Sem_Ch6 is -- On access-to-subprogram types it is used to determine if the target -- function might return an object with tasks. - function Needs_Accessibility_Check_Extra + function Needs_Extra_Accessibility (E : Entity_Id; Formal : Node_Id) return Boolean; -- Determines whether the given formal of E needs an extra formal for -- supporting accessibility checking. Returns True for both anonymous -- access formals and formals of named access types that are marked as -- controlling formals. The latter case can occur when the subprogram - -- Expand_Dispatching_Call creates a subprogram-type and substitutes + -- Expand_Dispatching_Call creates a subprogram type and substitutes -- the types of access-to-class-wide actuals for the anonymous access- -- to-specific-type of controlling formals. @@ -9025,13 +8973,43 @@ package body Sem_Ch6 is (Collect_Ancestors_With_No_Task_Parts (Original)); end Might_Need_BIP_Task_Actuals; - ------------------------------------- - -- Needs_Accessibility_Check_Extra -- - ------------------------------------- + ------------------------------- + -- Needs_Extra_Accessibility -- + ------------------------------- - function Needs_Accessibility_Check_Extra + function Needs_Extra_Accessibility (E : Entity_Id; - Formal : Node_Id) return Boolean is + Formal : Node_Id) return Boolean + is + Btyp : constant Entity_Id := Base_Type (Etype (Formal)); + -- Base_Type is applied to handle cases where there is a null + -- exclusion and the formal may have an access subtype. + + function Profile_Needs_Extra (Typ : Entity_Id) return Boolean; + -- Return True if the profile of Typ, a subprogram type, needs at + -- least one extra formal for supporting accessibility checking. + + ------------------------- + -- Profile_Needs_Extra -- + ------------------------- + + function Profile_Needs_Extra (Typ : Entity_Id) return Boolean is + Formal : Entity_Id; + + begin + Formal := First_Formal (Typ); + while Present (Formal) loop + if Needs_Extra_Accessibility (E, Formal) then + return True; + end if; + + Next_Formal (Formal); + end loop; + + return False; + end Profile_Needs_Extra; + + -- Start of processing for Needs_Extra_Accessibility begin -- For dispatching operations this extra formal is not suppressed @@ -9053,15 +9031,13 @@ package body Sem_Ch6 is return False; end if; - -- Base_Type is applied to handle cases where there is a null - -- exclusion the formal may have an access subtype. - return - Ekind (Base_Type (Etype (Formal))) = E_Anonymous_Access_Type - or else - (Is_Controlling_Formal (Formal) - and then Is_Access_Type (Base_Type (Etype (Formal)))); - end Needs_Accessibility_Check_Extra; + Ekind (Btyp) = E_Anonymous_Access_Type + or else (Ekind (Btyp) = E_Anonymous_Access_Subprogram_Type + and then Profile_Needs_Extra (Designated_Type (Btyp))) + or else (Is_Access_Type (Btyp) + and then Is_Controlling_Formal (Formal)); + end Needs_Extra_Accessibility; ----------------------- -- Parent_Subprogram -- @@ -9554,7 +9530,7 @@ package body Sem_Ch6 is -- Extra formal for supporting accessibility checking - if Needs_Accessibility_Check_Extra (Ref_E, Formal) then + if Needs_Extra_Accessibility (Ref_E, Formal) then pragma Assert (No (Parent_Formal) or else Present (Extra_Accessibility (Parent_Formal))); pragma Assert (No (Alias_Formal) @@ -11677,6 +11653,7 @@ package body Sem_Ch6 is Set_Has_Completion (Op_Name); Set_Corresponding_Equality (Op_Name, S); Set_Is_Abstract_Subprogram (Op_Name, Is_Abstract_Subprogram (S)); + Set_Is_Primitive (Op_Name, Is_Primitive (S)); end; end Make_Inequality_Operator; @@ -13295,23 +13272,22 @@ package body Sem_Ch6 is -- operation was dispatching), so Check_Dispatching_Operation is not -- called in that case. - if No (Derived_Type) - or else Is_Tagged_Type (Derived_Type) - then + if No (Derived_Type) or else Is_Tagged_Type (Derived_Type) then Check_Dispatching_Operation (S, Empty); end if; end if; - -- If this is a user-defined equality operator that is not a derived - -- subprogram, create the corresponding inequality. If the operation is - -- dispatching, the expansion is done elsewhere, and we do not create - -- an explicit inequality operation. - <> + -- If this is an equality operator whose result type is Boolean and + -- that is not a derived subprogram, create the implicit inequality + -- operator (RM 6.6(6)), but not if it is a dispatching user-defined + -- equality operator because those are handled specially. + if Chars (S) = Name_Op_Eq and then Base_Type (Etype (S)) = Standard_Boolean - and then Present (Parent (S)) - and then not Is_Dispatching_Operation (S) + and then No (Alias (S)) + and then not (Is_Dispatching_Operation (S) + and then Is_User_Defined_Equality (S)) then Make_Inequality_Operator (S); @@ -13323,6 +13299,48 @@ package body Sem_Ch6 is then Check_Untagged_Equality (S); end if; + + -- If this is an inherited implicit inequality operator, set its + -- Corresponding_Equality to the inherited equality operator. + + elsif Chars (S) = Name_Op_Ne + and then Base_Type (Etype (S)) = Standard_Boolean + and then Present (Alias (S)) + and then Present (Corresponding_Equality (Alias (S))) + then + declare + Eq : constant Entity_Id := Prev_Entity (S); + + function Check_Correspondence return Boolean; + -- Check that the Corresponding_Equality of the immediate + -- ancestor of S is an ancestor of Eq. Note that we cannot + -- be more specific for Eq since Sem_Ch3.Derive_Subprogram + -- does not set the Alias field of derived subprograms the + -- same way for intrinsic and nonintrinsic subprograms. + + -------------------------- + -- Check_Correspondence -- + -------------------------- + + function Check_Correspondence return Boolean is + A : Entity_Id := Alias (Eq); + + begin + while Present (A) loop + if Corresponding_Equality (Alias (S)) = A then + return True; + end if; + + A := Alias (A); + end loop; + + return False; + end Check_Correspondence; + + begin + pragma Assert (Check_Correspondence); + Set_Corresponding_Equality (S, Eq); + end; end if; end New_Overloaded_Entity; diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index e8490bc503e9..661aa6beef3d 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -776,10 +776,6 @@ package body Sem_Ch8 is -- has already established its actual subtype. This is only relevant -- if the renamed object is an explicit dereference. - function Get_Object_Name (Nod : Node_Id) return Node_Id; - -- Obtain the name of the object from node Nod which is being renamed by - -- the object renaming declaration N. - function Find_Raise_Node (N : Node_Id) return Traverse_Result; -- Process one node in search for N_Raise_xxx_Error nodes. -- Return Abandon if found, OK otherwise. @@ -908,38 +904,6 @@ package body Sem_Ch8 is end if; end Check_Constrained_Object; - --------------------- - -- Get_Object_Name -- - --------------------- - - function Get_Object_Name (Nod : Node_Id) return Node_Id is - Obj_Nam : Node_Id; - - begin - Obj_Nam := Nod; - while Present (Obj_Nam) loop - case Nkind (Obj_Nam) is - when N_Attribute_Reference - | N_Explicit_Dereference - | N_Indexed_Component - | N_Slice - => - Obj_Nam := Prefix (Obj_Nam); - - when N_Selected_Component => - Obj_Nam := Selector_Name (Obj_Nam); - - when N_Qualified_Expression | N_Type_Conversion => - Obj_Nam := Expression (Obj_Nam); - - when others => - exit; - end case; - end loop; - - return Obj_Nam; - end Get_Object_Name; - -- Start of processing for Analyze_Object_Renaming begin @@ -1387,9 +1351,9 @@ package body Sem_Ch8 is return; end if; - if Ada_Version >= Ada_2005 and then Nkind (Nam) in N_Has_Entity then + if Ada_Version >= Ada_2005 and then Is_Entity_Name (Nam) then declare - Nam_Ent : constant Entity_Id := Entity (Get_Object_Name (Nam)); + Nam_Ent : constant Entity_Id := Entity (Nam); Nam_Decl : constant Node_Id := Declaration_Node (Nam_Ent); begin diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb index aa4c813115de..6c9f7b876369 100644 --- a/gcc/ada/sem_ch9.adb +++ b/gcc/ada/sem_ch9.adb @@ -2388,8 +2388,6 @@ package body Sem_Ch9 is It : Interp; Enclosing : Entity_Id; Target_Obj : Node_Id := Empty; - Req_Scope : Entity_Id; - Outer_Ent : Entity_Id; Synch_Type : Entity_Id := Empty; -- Start of processing for Analyze_Requeue @@ -2456,41 +2454,22 @@ package body Sem_Ch9 is end; end if; - -- If an explicit target object is given then we have to check the - -- restrictions of 9.5.4(6). + -- If an explicit target object is specified then we have to check the + -- restrictions of 9.5.4(6), unless it is a parameter of the innermost + -- enclosing accept statement or entry body. - if Present (Target_Obj) then - - -- Locate containing concurrent unit and determine enclosing entry - -- body or outermost enclosing accept statement within the unit. - - Outer_Ent := Empty; - for S in reverse 0 .. Scope_Stack.Last loop - Req_Scope := Scope_Stack.Table (S).Entity; - - exit when Is_Concurrent_Type (Req_Scope); - - if Is_Entry (Req_Scope) then - Outer_Ent := Req_Scope; - end if; - end loop; - - pragma Assert (Present (Outer_Ent)); - - -- Check that the accessibility level of the target object is not - -- greater or equal to the outermost enclosing accept statement (or - -- entry body) unless it is a parameter of the innermost enclosing - -- accept statement (or entry body). - - if Static_Accessibility_Level (Target_Obj, Zero_On_Dynamic_Level) - >= Scope_Depth (Outer_Ent) - and then - (not Is_Entity_Name (Target_Obj) - or else not Is_Formal (Entity (Target_Obj)) - or else Enclosing /= Scope (Entity (Target_Obj))) + if Present (Target_Obj) + and then + (not Is_Entity_Name (Target_Obj) + or else not Is_Formal (Entity (Target_Obj)) + or else Enclosing /= Scope (Entity (Target_Obj))) + then + if Static_Accessibility_Level (Target_Obj) + > Static_Local_Access_Level (Enclosing) then Error_Msg_N - ("target object has invalid level for requeue", Target_Obj); + ("accessibility level of target object is too deep for requeue" + & " (RM 9.5.4(6))", Target_Obj); end if; end if; diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb index c093d1122d0e..cf12321cc5cd 100644 --- a/gcc/ada/sem_disp.adb +++ b/gcc/ada/sem_disp.adb @@ -53,6 +53,7 @@ with Sem_Util; use Sem_Util; with Snames; use Snames; with Sinfo.Nodes; use Sinfo.Nodes; with Sinfo.Utils; use Sinfo.Utils; +with Stand; use Stand; with Tbuild; use Tbuild; with Uintp; use Uintp; with Warnsw; use Warnsw; @@ -1286,10 +1287,20 @@ package body Sem_Disp is then return; - -- Wrappers of access to subprograms are not primitive subprograms. + -- Wrappers of access to subprograms are not dispatching operations elsif Is_Access_To_Subprogram_Wrapper (Subp) then return; + + -- Inequality operators whose result type is Boolean are not dispatching + -- operations because they are always implicitly declared as giving the + -- complementary result of the sibling equality operator (RM 6.6(5-6)). + + elsif Ekind (Subp) = E_Function + and then Chars (Subp) = Name_Op_Ne + and then Base_Type (Etype (Subp)) = Standard_Boolean + then + return; end if; Set_Is_Dispatching_Operation (Subp, False); diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb index fefb01029d39..06b7be53f057 100644 --- a/gcc/ada/sem_elab.adb +++ b/gcc/ada/sem_elab.adb @@ -12777,9 +12777,24 @@ package body Sem_Elab is if Present (Body_Id) and then Save_Invocation_Graph_Of_Body (Cunit (Main_Unit)) then - Process_Declarations - (Decls => Declarations (Unit_Declaration_Node (Body_Id)), - In_State => In_State); + declare + Decl : constant Node_Id := Declaration_Node (Body_Id); + + begin + -- Prevent infinite recursion for broken subunit + + if Nkind (Decl) = N_Package_Body_Stub + and then No (Stub_Subunit (Decl)) + then + null; + + else + Process_Declarations + (Decls => + Declarations (Unit_Declaration_Node (Body_Id)), + In_State => In_State); + end if; + end; end if; end if; end Process_Package_Declaration; diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index ffbb444cfe1f..50e9f4540672 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -124,11 +124,6 @@ package body Sem_Eval is V : Uint; end record; - type Match_Result is (Match, No_Match, Non_Static); - -- Result returned from functions that test for a matching result. If the - -- operands are not OK_Static then Non_Static will be returned. Otherwise - -- Match/No_Match is returned depending on whether the match succeeds. - type CV_Cache_Array is array (CV_Range) of CV_Entry; CV_Cache : CV_Cache_Array; @@ -179,16 +174,6 @@ package body Sem_Eval is -- a reference to a type, one of whose bounds raises Constraint_Error, then -- it also sets the Raises_Constraint_Error flag on the Choice itself. - function Choices_Match - (Expr : Node_Id; - Choices : List_Id) return Match_Result; - -- This function applies Choice_Matches to each element of Choices. If the - -- result is No_Match, then it continues and checks the next element. If - -- the result is Match or Non_Static, this result is immediately given - -- as the result without checking the rest of the list. Expr can be of - -- discrete, real, or string type and must be a compile-time-known value - -- (it is an error to make the call if these conditions are not met). - procedure Eval_Intrinsic_Call (N : Node_Id; E : Entity_Id); -- Evaluate a call N to an intrinsic subprogram E @@ -1791,6 +1776,12 @@ package body Sem_Eval is return False; end if; + -- Never look at junk bounds of a broken type + + if Error_Posted (Scalar_Range (Typ)) then + return False; + end if; + -- Otherwise check bounds for compile-time-known if not Compile_Time_Known_Value (Type_Low_Bound (Typ)) then @@ -2236,8 +2227,7 @@ package body Sem_Eval is -- expressions raise CE, except for the one that will be selected. procedure Eval_Case_Expression (N : Node_Id) is - Alt : Node_Id; - Choice : Node_Id; + Alt : Node_Id; begin Set_Is_Static_Expression (N, False); @@ -2292,44 +2282,35 @@ package body Sem_Eval is if Raises_Constraint_Error (Expression (N)) then Set_Raises_Constraint_Error (N); + return; + end if; -- Otherwise we need to check the alternatives to find the matching -- one. CE's in other than the matching one are not relevant. But we -- do need to check the matching one. Unlike the first loop, we do not -- have to go all the way through, when we find the matching one, quit. - else - Alt := First (Alternatives (N)); - Search : loop - - -- We must find a match among the alternatives. If not, this must - -- be due to other errors, so just ignore, leaving as non-static. - - if No (Alt) then - Set_Is_Static_Expression (N, False); - return; - end if; - - -- Otherwise loop through choices of this alternative - - Choice := First (Discrete_Choices (Alt)); - while Present (Choice) loop + Alt := First (Alternatives (N)); + loop + -- We must find a match among the alternatives. If not, this must + -- be due to other errors, so just ignore, leaving as non-static. - -- If we find a matching choice, then the Expression of this - -- alternative replaces N (Raises_Constraint_Error flag is - -- included, so we don't have to special case that). + if No (Alt) then + Set_Is_Static_Expression (N, False); + return; + end if; - if Choice_Matches (Expression (N), Choice) = Match then - Rewrite (N, Relocate_Node (Expression (Alt))); - return; - end if; + -- If we find a matching choice, then the Expression of this + -- alternative replaces N (Raises_Constraint_Error flag is + -- included, so we don't have to special case that). - Next (Choice); - end loop; + if Choices_Match (Expression (N), Discrete_Choices (Alt)) = Match then + Rewrite (N, Relocate_Node (Expression (Alt))); + return; + end if; - Next (Alt); - end loop Search; - end if; + Next (Alt); + end loop; end Eval_Case_Expression; ------------------------ diff --git a/gcc/ada/sem_eval.ads b/gcc/ada/sem_eval.ads index 005c577f3273..9803245a036a 100644 --- a/gcc/ada/sem_eval.ads +++ b/gcc/ada/sem_eval.ads @@ -168,9 +168,20 @@ package Sem_Eval is -- Returns True if the checking for potentially static expressions is -- enabled; otherwise returns False. - procedure Set_Checking_Potentially_Static_Expression (Value : Boolean); - -- Enables checking for potentially static expressions if Value is True, - -- and disables such checking if Value is False. + type Match_Result is (Match, No_Match, Non_Static); + -- Result returned from functions that test for a matching result. If the + -- operands are not OK_Static then Non_Static will be returned. Otherwise + -- Match/No_Match is returned depending on whether the match succeeds. + + function Choices_Match + (Expr : Node_Id; + Choices : List_Id) return Match_Result; + -- This function applies Choice_Matches to each element of Choices. If the + -- result is No_Match, then it continues and checks the next element. If + -- the result is Match or Non_Static, this result is immediately given + -- as the result without checking the rest of the list. Expr can be of + -- discrete, real, or string type and must be a compile-time-known value + -- (it is an error to make the call if these conditions are not met). type Compare_Result is (LT, LE, EQ, GT, GE, NE, Unknown); subtype Compare_GE is Compare_Result range EQ .. GE; @@ -479,6 +490,10 @@ package Sem_Eval is -- match. Separated out from Subtypes_Statically_Match so that it can -- be used in specializing error messages. + procedure Set_Checking_Potentially_Static_Expression (Value : Boolean); + -- Enables checking for potentially static expressions if Value is True, + -- and disables such checking if Value is False. + function Subtypes_Statically_Compatible (T1 : Entity_Id; T2 : Entity_Id; diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 29ef2a46a44f..827192ace384 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -14785,12 +14785,19 @@ package body Sem_Prag is Check_Arg_Order (Names); Mark_Ghost_Pragma (N, Current_Scope); + -- Diagnose the case of a quantified expression being mistaken + -- for an iterated component association, because the user has + -- forgotten the "all" or "some" keyword after "for". + + if Nkind (Arg_Check) = N_Iterated_Component_Association then + Malformed_Quantified_Expression (Arg_Check); + -- Special processing for Loop_Invariant, Loop_Variant or for -- other cases where a Loop_Entry attribute is present. If the -- assertion pragma contains attribute Loop_Entry, ensure that -- the related pragma is within a loop. - if Prag_Id = Pragma_Loop_Invariant + elsif Prag_Id = Pragma_Loop_Invariant or else Prag_Id = Pragma_Loop_Variant or else Contains_Loop_Entry (Arg_Check) then @@ -15982,10 +15989,17 @@ package body Sem_Prag is Preanalyze_And_Resolve (Arg_Message, Standard_String); end if; + -- Diagnose the case of a quantified expression being mistaken + -- for an iterated component association, because the user has + -- forgotten the "all" or "some" keyword after "for". + + if Nkind (Arg_Check) = N_Iterated_Component_Association then + Malformed_Quantified_Expression (Arg_Check); + -- When expansion is active but check is not, only preanalyze the -- boolean to avoid pulling useless dependencies. - if Expander_Active and Is_Ignored_In_Codegen (N) then + elsif Expander_Active and Is_Ignored_In_Codegen (N) then In_Assertion_Expr := In_Assertion_Expr + 1; Preanalyze_And_Resolve (Arg_Check, Any_Boolean); In_Assertion_Expr := In_Assertion_Expr - 1; diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 61bc36e677c3..758d90cbfa5d 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -1976,6 +1976,28 @@ package body Sem_Res is end if; end Make_Call_Into_Operator; + ------------------------------------- + -- Malformed_Quantified_Expression -- + ------------------------------------- + + procedure Malformed_Quantified_Expression (N : Node_Id) is + begin + -- Because the error message starts with "missing ALL", we automatically + -- benefit from the associated CODEFIX, which requires that the message + -- is located on the identifier following "for" in order for the CODEFIX + -- to insert "all" in the right place. + + if Present (Iterator_Specification (N)) then + Error_Msg_N -- CODEFIX + ("missing ALL or SOME in quantified expression", + Defining_Identifier (Iterator_Specification (N))); + else + Error_Msg_N -- CODEFIX + ("missing ALL or SOME in quantified expression", + Defining_Identifier (N)); + end if; + end Malformed_Quantified_Expression; + ------------------- -- Operator_Kind -- ------------------- @@ -3221,35 +3243,18 @@ package body Sem_Res is Error_Msg_N ("\use -gnatf for details", N); end if; - -- Recognize the case of a quantified expression being mistaken - -- for an iterated component association because the user - -- forgot the "all" or "some" keyword after "for". Because the - -- error message starts with "missing ALL", we automatically - -- benefit from the associated CODEFIX, which requires that - -- the message is located on the identifier following "for" - -- in order for the CODEFIX to insert "all" in the right place. + -- Diagnose the case of a quantified expression being mistaken + -- for an iterated component association, because the user has + -- forgotten the "all" or "some" keyword after "for". elsif Nkind (N) = N_Aggregate + and then Is_Boolean_Type (Typ) and then List_Length (Component_Associations (N)) = 1 and then Nkind (First (Component_Associations (N))) = N_Iterated_Component_Association - and then Is_Boolean_Type (Typ) then - if Present - (Iterator_Specification - (First (Component_Associations (N)))) - then - Error_Msg_N -- CODEFIX - ("missing ALL or SOME in quantified expression", - Defining_Identifier - (Iterator_Specification - (First (Component_Associations (N))))); - else - Error_Msg_N -- CODEFIX - ("missing ALL or SOME in quantified expression", - Defining_Identifier - (First (Component_Associations (N)))); - end if; + Malformed_Quantified_Expression + (First (Component_Associations (N))); -- For an operator with no interpretation, check whether one of -- its operands may be a user-defined literal. @@ -3716,8 +3721,9 @@ package body Sem_Res is procedure Accessibility_Error (S : String) is begin - Error_Msg_NE ("actual for aliased formal& has wrong accessibility" - & " in " & S & " (RM 6.4.1(6.4))", A, F); + Error_Msg_NE + ("accessibility level of actual is too deep for aliased formal&" + & " in " & S & " (RM 6.4.1(6.4))", A, F); end Accessibility_Error; begin @@ -3774,8 +3780,8 @@ package body Sem_Res is elsif Ekind (Etype (Nam)) = E_Anonymous_Access_Type and then Nkind (Parent (N)) = N_Type_Conversion and then - Type_Access_Level (Etype (Parent (N))) - < Static_Accessibility_Level (A, Zero_On_Dynamic_Level) + Static_Type_Access_Level (Etype (Parent (N))) + < Static_Accessibility_Level (A) then Accessibility_Error ("conversion"); @@ -3783,25 +3789,25 @@ package body Sem_Res is and then Nkind (Parent (N)) = N_Assignment_Statement and then Static_Accessibility_Level - (Name (Parent (N)), Object_Decl_Level) - < Static_Accessibility_Level (A, Zero_On_Dynamic_Level) + (Name (Parent (N)), Object_Decl_Level => True) + < Static_Accessibility_Level (A) then Accessibility_Error ("assignment"); elsif Nkind (Parent (N)) = N_Qualified_Expression and then Nkind (Parent (Parent (N))) = N_Allocator and then - Type_Access_Level (Etype (Parent (Parent (N)))) - < Static_Accessibility_Level (A, Zero_On_Dynamic_Level) + Static_Type_Access_Level (Etype (Parent (Parent (N)))) + < Static_Accessibility_Level (A) then Accessibility_Error ("allocator"); elsif In_Return_Value (N) and then Comes_From_Source (N) and then - Subprogram_Access_Level (Current_Subprogram) + Static_Subprogram_Access_Level (Current_Subprogram) < Static_Accessibility_Level - (A, Zero_On_Dynamic_Level, In_Return_Context => True) + (A, In_Return_Context => True) then Accessibility_Error ("return"); end if; @@ -4344,23 +4350,24 @@ package body Sem_Res is end if; end if; - -- If the formal is Out or In_Out, do not resolve and expand the - -- conversion, because it is subsequently expanded into explicit - -- temporaries and assignments. However, the object of the - -- conversion can be resolved. An exception is the case of tagged - -- type conversion with a class-wide actual. In that case we want - -- the tag check to occur and no temporary will be needed (no - -- representation change can occur) and the parameter is passed by - -- reference, so we go ahead and resolve the type conversion. - -- Another exception is the case of reference to component or - -- subcomponent of a bit-packed array, in which case we want to - -- defer expansion to the point the in and out assignments are - -- performed. + -- If the formal is Out or In Out, do not resolve and expand a + -- type conversion if it is to an elementary type, or an array + -- type, or if it involves a change of representation, because + -- it will be subsequently expanded into explicit temporaries + -- and assignments (see Exp_Ch6.Expand_Actuals). However, the + -- expression of the conversion needs to be resolved, except + -- in the case of a reference to a component or subcomponent + -- of a bit-packed array, in which case we want to defer the + -- expansion to the point the assignments are performed. if Ekind (F) /= E_In_Parameter and then Nkind (A) = N_Type_Conversion - and then not Is_Class_Wide_Type (Etype (Expression (A))) - and then not Is_Interface (Etype (A)) + and then (Is_Elementary_Type (Etype (A)) + or else Is_Array_Type (Etype (A)) + or else not + Has_Compatible_Representation + (Target_Typ => Etype (A), + Operand_Typ => Etype (Expression (A)))) then declare Expr_Typ : constant Entity_Id := Etype (Expression (A)); @@ -4368,9 +4375,7 @@ package body Sem_Res is begin -- Check RM 4.6 (24.2/2) - if Is_Array_Type (Etype (F)) - and then Is_View_Conversion (A) - then + if Is_Array_Type (Etype (F)) then -- In a view conversion, the conversion must be legal in -- both directions, and thus both component types must be -- aliased, or neither (4.6 (8)). @@ -5366,9 +5371,11 @@ package body Sem_Res is Prefix : constant String := (if Nkind (Exp) = N_Attribute_Reference then "prefix of attribute" - else "type of access discriminant"); + else "access discriminant"); Message : constant String := - Prefix & " has deeper level than allocator type"; + Prefix + & " has deeper accessibility level than allocator type" + & " (RM 4.8(5.3))"; begin -- In an instance, this is a runtime check, but one we know will fail @@ -5410,8 +5417,8 @@ package body Sem_Res is return; end if; - if Static_Accessibility_Level (Disc_Exp, Zero_On_Dynamic_Level) - > Deepest_Type_Access_Level (Alloc_Typ) + if Static_Accessibility_Level (Disc_Exp) + > Static_Type_Access_Level (Alloc_Typ, Deepest => True) then Accessibility_Error (Disc_Exp); end if; @@ -5653,8 +5660,9 @@ package body Sem_Res is elsif Has_Anonymous_Access_Discriminant (Subtyp) and then Is_Entity_Name (Exp) and then Is_Formal (Entity (Exp)) - and then Static_Accessibility_Level (Exp, Zero_On_Dynamic_Level) - > Deepest_Type_Access_Level (Typ) + and then + Static_Accessibility_Level (Exp) + > Static_Type_Access_Level (Typ, Deepest => True) then Accessibility_Error (Exp); end if; @@ -5718,10 +5726,12 @@ package body Sem_Res is -- the case of an initialized allocator with a class-wide argument (see -- Expand_Allocator_Expression). - if Ada_Version >= Ada_2005 - and then Is_Class_Wide_Type (Desig_T) - then + if Ada_Version >= Ada_2005 and then Is_Class_Wide_Type (Desig_T) then declare + Message : constant String := + "allocated type has deeper accessibility level than allocator" + & " type (RM 4.8(5.2))"; + Exp_Typ : Entity_Id; begin @@ -5733,14 +5743,12 @@ package body Sem_Res is Exp_Typ := Entity (E); end if; - if Type_Access_Level (Exp_Typ) > - Deepest_Type_Access_Level (Typ) + if Static_Type_Access_Level (Exp_Typ) + > Static_Type_Access_Level (Typ, Deepest => True) then if In_Instance_Body then Error_Msg_Warn := SPARK_Mode /= On; - Error_Msg_N - ("type in allocator has deeper level than designated " - & "class-wide type<<", E); + Error_Msg_N (Message & "<<", E); Error_Msg_N ("\Program_Error [<<", E); Rewrite (N, @@ -5756,9 +5764,7 @@ package body Sem_Res is elsif not Is_Generic_Type (Exp_Typ) and then not In_Generic_Formal_Package (Exp_Typ) then - Error_Msg_N - ("type in allocator has deeper level than designated " - & "class-wide type", E); + Error_Msg_N (Message, E); end if; end if; end; @@ -8322,11 +8328,14 @@ package body Sem_Res is end if; end loop; + -- Mark it now since it is going to be rewritten below + + Set_Analyzed (E_Name); + New_N := Make_Selected_Component (Loc, - Prefix => New_Occurrence_Of (S, Loc), - Selector_Name => - New_Occurrence_Of (Entity (E_Name), Loc)); + Prefix => New_Occurrence_Of (S, Loc), + Selector_Name => New_Occurrence_Of (Entity (E_Name), Loc)); Rewrite (E_Name, New_N); Analyze (E_Name); @@ -8380,7 +8389,7 @@ package body Sem_Res is -- Generate a reference for the index when it denotes an entity if Is_Entity_Name (Index) then - Generate_Reference (Entity (Index), Nam); + Generate_Reference (Entity (Index), Index); end if; -- Up to this point the expression could have been the actual in a @@ -10317,6 +10326,7 @@ package body Sem_Res is and then (Is_Overloaded (R) or else (not Is_Universal_Numeric_Type (Etype (R)) + and then not Is_Generic_Type (Etype (R)) and then (not Is_Integer_Type (Etype (R)) or else @@ -13078,6 +13088,32 @@ package body Sem_Res is Index_Subtype : Entity_Id; begin + -- The back end expects the String_Literal_Subtype to have a + -- static lower bound. + + if Is_Integer_Type (Index_Type) then + Set_String_Literal_Low_Bound + (Subtype_Id, Make_Integer_Literal (Loc, 1)); + + -- If the index type is an enumeration type, build the bound + -- expression by means of an attribute. + + else + Set_String_Literal_Low_Bound + (Subtype_Id, + Make_Attribute_Reference (Loc, + Attribute_Name => Name_First, + Prefix => + New_Occurrence_Of (Base_Type (Index_Type), Loc))); + end if; + + Analyze_And_Resolve + (String_Literal_Low_Bound (Subtype_Id), Base_Type (Index_Type)); + + -- Now build a subtype with the actual bounds and wrap the literal + -- in an unchecked conversion to it, after checking that the high + -- bound is within the range of the index type if need be. + if Length = 1 then High_Bound := New_Copy_Tree (Low_Bound); @@ -13086,6 +13122,9 @@ package body Sem_Res is Make_Op_Add (Loc, Left_Opnd => New_Copy_Tree (Low_Bound), Right_Opnd => Make_Integer_Literal (Loc, Length - 1)); + if Length > 0 then + High_Bound := Convert_To (Index_Type, High_Bound); + end if; else High_Bound := @@ -13106,29 +13145,6 @@ package body Sem_Res is Make_Integer_Literal (Loc, Length - 1)))); end if; - if Is_Integer_Type (Index_Type) then - Set_String_Literal_Low_Bound - (Subtype_Id, Make_Integer_Literal (Loc, 1)); - - else - -- If the index type is an enumeration type, build bounds - -- expression with attributes. - - Set_String_Literal_Low_Bound - (Subtype_Id, - Make_Attribute_Reference (Loc, - Attribute_Name => Name_First, - Prefix => - New_Occurrence_Of (Base_Type (Index_Type), Loc))); - end if; - - Analyze_And_Resolve - (String_Literal_Low_Bound (Subtype_Id), Base_Type (Index_Type)); - - -- Build bona fide subtype for the string, and wrap it in an - -- unchecked conversion, because the back end expects the - -- String_Literal_Subtype to have a static lower bound. - Index_Subtype := Create_Itype (Subtype_Kind (Ekind (Index_Type)), N); Drange := Make_Range (Loc, New_Copy_Tree (Low_Bound), High_Bound); @@ -13617,9 +13633,9 @@ package body Sem_Res is Operand : Node_Id; Report_Errs : Boolean := True) return Boolean is - Target_Type : constant Entity_Id := Base_Type (Target); - Opnd_Type : Entity_Id; - Inc_Ancestor : Entity_Id; + Message : constant String := + " has deeper accessibility level than target type (RM 4.6(24.21))"; + Target_Type : constant Entity_Id := Base_Type (Target); function Conversion_Check (Valid : Boolean; @@ -13644,7 +13660,7 @@ package body Sem_Res is -- discriminant selected from a dereference of another such "bad" -- conversion argument. - function Valid_Array_Conversion return Boolean; + function Valid_Array_Conversion (Opnd_Type : Entity_Id) return Boolean; -- Check index and component conformance, and accessibility levels if -- the component types are anonymous access types (Ada 2005). @@ -13786,7 +13802,7 @@ package body Sem_Res is -- Valid_Array_Conversion -- ---------------------------- - function Valid_Array_Conversion return Boolean is + function Valid_Array_Conversion (Opnd_Type : Entity_Id) return Boolean is Opnd_Comp_Type : constant Entity_Id := Component_Type (Opnd_Type); Opnd_Comp_Base : constant Entity_Id := Base_Type (Opnd_Comp_Type); @@ -13860,14 +13876,14 @@ package body Sem_Res is and then Subtypes_Statically_Match (Target_Comp_Type, Opnd_Comp_Type) then - if Type_Access_Level (Target_Type) < - Deepest_Type_Access_Level (Opnd_Type) + if Static_Type_Access_Level (Opnd_Type) + > Static_Type_Access_Level (Target_Type, Deepest => True) then if In_Instance_Body then Error_Msg_Warn := SPARK_Mode /= On; Report_Error_N - ("source array type has deeper accessibility " - & "level than target<<", Operand, Report_Errs); + ("operand array type" & Message & "<<", + Operand, Report_Errs); Report_Error_N ("\Program_Error [<<", Operand, Report_Errs); Rewrite (N, @@ -13880,13 +13896,9 @@ package body Sem_Res is else Report_Error_N - ("source array type has deeper accessibility " - & "level than target", Operand, Report_Errs); + ("operand array type" & Message, Operand, Report_Errs); return False; end if; - - else - null; end if; -- All other cases where component base types do not match @@ -13916,11 +13928,22 @@ package body Sem_Res is return True; end Valid_Array_Conversion; + -- Local variables + + Inc_Ancestor : Entity_Id; + Opnd_Type : Entity_Id; + -- Start of processing for Valid_Conversion begin Check_Parameterless_Call (Operand); + -- Prevent spurious errors coming from failed checks + + if Nkind (Operand) in N_Raise_xxx_Error then + return True; + end if; + if Is_Overloaded (Operand) and then Is_Ambiguous_Operand (Operand) then @@ -14005,7 +14028,7 @@ package body Sem_Res is return False; else - return Valid_Array_Conversion; + return Valid_Array_Conversion (Opnd_Type); end if; -- Ada 2005 (AI-251): Internally generated conversions of access to @@ -14073,16 +14096,14 @@ package body Sem_Res is end if; end; - -- Check the static accessibility rule of 4.6(17). Note that the - -- check is not enforced when within an instance body, since the - -- RM requires such cases to be caught at run time. - - -- If the operand is a rewriting of an allocator no check is needed + -- If the operand is a rewriting of an allocator, no check is needed -- because there are no accessibility issues. if Nkind (Original_Node (N)) = N_Allocator then null; + -- Otherwise, check the static accessibility rules of 4.6(24.11-21) + elsif Ekind (Target_Type) /= E_Anonymous_Access_Type or else Is_Local_Anonymous_Access (Target_Type) or else Nkind (Associated_Node_For_Itype (Target_Type)) = @@ -14122,12 +14143,12 @@ package body Sem_Res is -- not deeper than the target type. if No_Dynamic_Accessibility_Checks_Enabled (N) then - if Type_Access_Level (Opnd_Type) - > Deepest_Type_Access_Level (Target_Type) + if Static_Type_Access_Level (Opnd_Type) + > Static_Type_Access_Level + (Target_Type, Deepest => True) then Report_Error_N - ("operand has deeper level than target", Operand, - Report_Errs); + ("operand type" & Message, Operand, Report_Errs); return False; end if; @@ -14140,7 +14161,8 @@ package body Sem_Res is then Report_Error_N ("implicit conversion of stand-alone anonymous " - & "access object not allowed", Operand, Report_Errs); + & "access object not allowed (RM 8.6(27.1))", + Operand, Report_Errs); return False; -- Implicit conversions aren't allowed for anonymous access @@ -14155,7 +14177,7 @@ package body Sem_Res is then Report_Error_N ("implicit conversion of anonymous access parameter " - & "not allowed", Operand, Report_Errs); + & "not allowed (RM 8.6(27.1))", Operand, Report_Errs); return False; -- Detect access discriminant values that are illegal @@ -14165,19 +14187,19 @@ package body Sem_Res is then Report_Error_N ("implicit conversion of anonymous access value " - & "not allowed", Operand, Report_Errs); + & "not allowed (RM 8.6(27.1))", Operand, Report_Errs); return False; - -- In other cases, the level of the operand's type must be - -- statically less deep than that of the target type, else - -- implicit conversion is disallowed (by RM12-8.6(27.1/3)). + -- In other cases, the level of the operand type must not + -- be statically deeper than that of the target type. - elsif Type_Access_Level (Opnd_Type) > - Deepest_Type_Access_Level (Target_Type) + elsif Static_Type_Access_Level (Opnd_Type) + > Static_Type_Access_Level + (Target_Type, Deepest => True) then Report_Error_N - ("implicit conversion of anonymous access value " - & "violates accessibility", Operand, Report_Errs); + ("anonymous access type" & Message, + Operand, Report_Errs); return False; end if; end if; @@ -14197,8 +14219,8 @@ package body Sem_Res is -- master of the call to the enclosing function (RM 3.10.2(10.3), -- 3.10.2(14) and 3.10.2(10.5)). - elsif Type_Access_Level (Opnd_Type, Assoc_Ent => Operand) - > Deepest_Type_Access_Level (Target_Type) + elsif Static_Type_Access_Level (Opnd_Type, Assoc_Node => Operand) + > Static_Type_Access_Level (Target_Type, Deepest => True) and then (Nkind (Associated_Node_For_Itype (Opnd_Type)) /= N_Function_Specification or else Ekind (Target_Type) in Anonymous_Access_Kind @@ -14215,7 +14237,7 @@ package body Sem_Res is if In_Instance_Body then Error_Msg_Warn := SPARK_Mode /= On; Report_Error_N - ("cannot convert local pointer to non-local access type<<", + ("operand type" & Message & "<<", Operand, Report_Errs); Report_Error_N ("\Program_Error [<<", Operand, Report_Errs); Rewrite (N, @@ -14231,8 +14253,7 @@ package body Sem_Res is if not Error_Posted (N) then Report_Error_N - ("cannot convert local pointer to non-local access type", - Operand, Report_Errs); + ("operand type" & Message, Operand, Report_Errs); end if; return False; end if; @@ -14249,9 +14270,9 @@ package body Sem_Res is -- checking the prefix of the operand for this case). if Nkind (Operand) = N_Selected_Component - and then Static_Accessibility_Level - (Operand, Zero_On_Dynamic_Level) - > Deepest_Type_Access_Level (Target_Type) + and then + Static_Accessibility_Level (Operand) + > Static_Type_Access_Level (Target_Type, Deepest => True) then -- In an instance, this is a run-time check, but one we know -- will fail, so generate an appropriate warning. @@ -14259,8 +14280,8 @@ package body Sem_Res is if In_Instance_Body then Error_Msg_Warn := SPARK_Mode /= On; Report_Error_N - ("cannot convert access discriminant to non-local " - & "access type<<", Operand, Report_Errs); + ("access discriminant" & Message & "<<", + Operand, Report_Errs); Report_Error_N ("\Program_Error [<<", Operand, Report_Errs); Rewrite (N, @@ -14273,8 +14294,7 @@ package body Sem_Res is else Report_Error_N - ("cannot convert access discriminant to non-local " - & "access type", Operand, Report_Errs); + ("access discriminant" & Message, Operand, Report_Errs); return False; end if; end if; @@ -14291,8 +14311,7 @@ package body Sem_Res is and then Present (Discriminal_Link (Entity (Operand))) then Report_Error_N - ("discriminant has deeper accessibility level than target", - Operand, Report_Errs); + ("access discriminant" & Message, Operand, Report_Errs); return False; end if; end if; @@ -14432,8 +14451,8 @@ package body Sem_Res is -- Check the static accessibility rule of 4.6(20) - if Type_Access_Level (Opnd_Type) > - Deepest_Type_Access_Level (Target_Type) + if Static_Type_Access_Level (Opnd_Type) + > Static_Type_Access_Level (Target_Type, Deepest => True) then Report_Error_N ("operand type has deeper accessibility level than target", diff --git a/gcc/ada/sem_res.ads b/gcc/ada/sem_res.ads index 1985d86eca37..b2b84239e36c 100644 --- a/gcc/ada/sem_res.ads +++ b/gcc/ada/sem_res.ads @@ -95,6 +95,10 @@ package Sem_Res is -- interpolated expression; used to improve the clarity of reported -- error messages. + procedure Malformed_Quantified_Expression (N : Node_Id); + -- N is an N_Iterated_Component_Association in a boolean context. Give an + -- error about a malformed quantified expression. + procedure Preanalyze_And_Resolve (N : Node_Id; T : Entity_Id); -- Performs a preanalysis of expression node N. During preanalysis, N is -- analyzed and then resolved against type T, but no expansion is carried @@ -130,8 +134,7 @@ package Sem_Res is procedure Resolve_Entry (Entry_Name : Node_Id); -- Find name of entry being called, and resolve prefix of name with its - -- own type. For now we assume that the prefix cannot be overloaded and - -- the name of the entry plays no role in the resolution. + -- own type. procedure Resolve_Implicit_Dereference (P : Node_Id); -- Called when P is the prefix of an indexed component, or of a selected @@ -161,10 +164,4 @@ package Sem_Res is Report_Errs : Boolean := True) return Boolean; -- Specific version of Valid_Conversion for when Target_Type is tagged -private - procedure Resolve_Implicit_Type (N : Node_Id) renames Resolve; - pragma Inline (Resolve_Implicit_Type); - -- We use this renaming to make the application of Inline very explicit to - -- this version, since other versions of Resolve are not inlined. - end Sem_Res; diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index d8bf6f0608f7..8080125dda9b 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -5076,7 +5076,7 @@ package body Sem_Util is and then Is_Public_Operation and then Scope_Depth (Pref_Encl_Typ) >= Static_Accessibility_Level - (Context, Object_Decl_Level) + (Context, Object_Decl_Level => True) then Error_Msg_N ("??possible unprotected access to protected data", Expr); @@ -15091,28 +15091,6 @@ package body Sem_Util is return False; end In_Return_Value; - ------------------------------------- - -- In_Reverse_Storage_Order_Object -- - ------------------------------------- - - function In_Reverse_Storage_Order_Object (N : Node_Id) return Boolean is - Pref : Node_Id; - Btyp : Entity_Id; - - begin - if Nkind (N) in N_Indexed_Component | N_Selected_Component then - Pref := Prefix (N); - Btyp := Base_Type (Etype (Pref)); - - return Present (Btyp) - and then (Is_Record_Type (Btyp) or else Is_Array_Type (Btyp)) - and then Reverse_Storage_Order (Btyp); - - else - return False; - end if; - end In_Reverse_Storage_Order_Object; - ------------------------------ -- In_Same_Declarative_Part -- ------------------------------ @@ -21720,6 +21698,34 @@ package body Sem_Util is return False; end Is_Renamed_Entry; + ------------------------------------- + -- Is_Reverse_Storage_Order_Object -- + ------------------------------------- + + function Is_Reverse_Storage_Order_Object (N : Node_Id) return Boolean is + Btyp : Entity_Id; + + begin + if not Is_Elementary_Type (Etype (N)) then + return False; + end if; + + case Nkind (N) is + when N_Indexed_Component | N_Selected_Component => + Btyp := Base_Type (Etype (Prefix (N))); + + when N_Unchecked_Type_Conversion => + Btyp := Base_Type (Etype (Expression (N))); + + when others => + return False; + end case; + + return Present (Btyp) + and then (Is_Record_Type (Btyp) or else Is_Array_Type (Btyp)) + and then Reverse_Storage_Order (Btyp); + end Is_Reverse_Storage_Order_Object; + ---------------------------- -- Is_Reversible_Iterator -- ---------------------------- @@ -23824,9 +23830,19 @@ package body Sem_Util is return False; -- Class-wide types are treated as controlled because derivations from - -- the root type may introduce controlled components. - - elsif Is_Class_Wide_Type (Typ) then + -- the root type may introduce controlled components, unless the root + -- type is declared with the No_Controlled_Parts aspect. + + elsif (Is_Class_Wide_Type (Typ) + and then not + Has_Enabled_Aspect + (Root_Type (Typ), Aspect_No_Controlled_Parts)) + or else (Is_Mutably_Tagged_CW_Equivalent_Type (Typ) + and then not + Has_Enabled_Aspect + (Root_Type (Corresponding_Mutably_Tagged_Type (Typ)), + Aspect_No_Controlled_Parts)) + then return True; -- Concurrent types are controlled as long as their corresponding record diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index c10900e8c7a3..bf76dc96fbf2 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -1767,10 +1767,6 @@ package Sem_Util is -- the return value and have its accessibility level tied to that of the -- result of the enclosing function. - function In_Reverse_Storage_Order_Object (N : Node_Id) return Boolean; - -- Returns True if N denotes a component in an array or a record that has - -- Reverse_Storage_Order. - function In_Same_Declarative_Part (Context : Node_Id; N : Node_Id) return Boolean; @@ -2501,6 +2497,11 @@ package Sem_Util is function Is_Renamed_Entry (Proc_Nam : Entity_Id) return Boolean; -- Return True if Proc_Nam is a procedure renaming of an entry + function Is_Reverse_Storage_Order_Object (N : Node_Id) return Boolean; + -- Return True if N denotes an elementary component of an array or record + -- that has Reverse_Storage_Order set, or an unchecked conversion to an + -- elementary type of such an array or record. + function Is_Reversible_Iterator (Typ : Entity_Id) return Boolean; -- AI05-0139-2: Check whether Typ is derived from the predefined interface -- Ada.Iterator_Interfaces.Reversible_Iterator. diff --git a/gcc/ada/sinfo.ads b/gcc/ada/sinfo.ads index a78fd31a1f20..9e8beec6049b 100644 --- a/gcc/ada/sinfo.ads +++ b/gcc/ada/sinfo.ads @@ -2255,8 +2255,11 @@ package Sinfo is -- to the expander. -- Selector_Name - -- Present in N_Expanded_Name N_Selected_Component, - -- N_Generic_Association, and N_Parameter_Association nodes. + -- Present in N_Expanded_Name and N_Selected_Component nodes, where it + -- references a name that denotes an entity declared in the prefix, as + -- well as in N_Generic_Association and N_Parameter_Association nodes, + -- where it references a name that denotes a formal parameter of the + -- generic unit or callable entity. -- Shift_Count_OK -- A flag present in shift nodes to indicate that the shift count is diff --git a/gcc/addresses.h b/gcc/addresses.h index 6a9ffcd7cb3f..7ce34554ee7c 100644 --- a/gcc/addresses.h +++ b/gcc/addresses.h @@ -17,38 +17,20 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ -/* Wrapper function to unify target macros MODE_CODE_BASE_REG_CLASS, - MODE_BASE_REG_REG_CLASS, MODE_BASE_REG_CLASS and BASE_REG_CLASS. - Arguments as for the MODE_CODE_BASE_REG_CLASS macro. */ +/* Wrapper function around the TARGET_BASE_REG_CLASS hook. MEM is the + MEM rtx being addressed, if known, and INSN is the instruction it + belongs to, if known; both may be null. */ #ifndef GCC_ADDRESSES_H #define GCC_ADDRESSES_H inline enum reg_class -base_reg_class (machine_mode mode ATTRIBUTE_UNUSED, - addr_space_t as ATTRIBUTE_UNUSED, - enum rtx_code outer_code ATTRIBUTE_UNUSED, - enum rtx_code index_code ATTRIBUTE_UNUSED, - rtx_insn *insn ATTRIBUTE_UNUSED = NULL) +base_reg_class (machine_mode mode, addr_space_t as, + enum rtx_code outer_code, enum rtx_code index_code, + rtx mem = NULL_RTX, rtx_insn *insn = NULL) { -#ifdef INSN_BASE_REG_CLASS - return INSN_BASE_REG_CLASS (insn); -#else -#ifdef MODE_CODE_BASE_REG_CLASS - return MODE_CODE_BASE_REG_CLASS (MACRO_MODE (mode), as, outer_code, - index_code); -#else -#ifdef MODE_BASE_REG_REG_CLASS - if (index_code == REG) - return MODE_BASE_REG_REG_CLASS (MACRO_MODE (mode)); -#endif -#ifdef MODE_BASE_REG_CLASS - return MODE_BASE_REG_CLASS (MACRO_MODE (mode)); -#else - return BASE_REG_CLASS; -#endif -#endif -#endif + return (enum reg_class) targetm.base_reg_class (mode, as, outer_code, + index_code, mem, insn); } inline enum reg_class diff --git a/gcc/algol68/ChangeLog b/gcc/algol68/ChangeLog index dc603e8c0908..f6ff2860ccd8 100644 --- a/gcc/algol68/ChangeLog +++ b/gcc/algol68/ChangeLog @@ -1,3 +1,237 @@ +2026-09-27 Cupertino Miranda + + * a68-lang.cc (a68_init): Anticipate the execution of + a68_init_ranges. + (get_global_context): Removed function. + (pushdecl): Replace call to get_global_context by + a68_range_context. + * a68.h: Remove A68_GLOBAL_CONTEXT macro. + +2026-09-27 Jose E. Marchesi + + * a68-low-moids.cc (build_stub_type_decl): Remove function. + (lower_struct_mode): Do not call build_stub_type_decl. + (lower_union_mode): Likewise. + +2026-09-25 Jose E. Marchesi + + * a68-types.h (struct TAG_T): Add field ctyp. + * a68-parser.cc (a68_new_tag): Initialize CTYPE. + * a68-low-decls.cc (fish_declarer_from_tree): New function. + (grok_typedef_in_decl): Likewise. + (a68_lower_mode_declaration): Install typedef variant type for a + defining-indicant in the symtab. + (a68_lower_variable_declaration): Call grok_typedef_in_decl. + (a68_lower_identity_declaration): Likewise. + * a68-low-ranges.cc (a68_pop_serial_clause_range): Compare main + variant types in sanity check at block exit. + * a68-low.cc (a68_low_assignation): Likewise in assignation. + +2026-09-25 Jose E. Marchesi + + * a68-low-bits.cc: Use front-end type nodes consistently. + * a68-low-bools.cc: Likewise. + * a68-low-chars.cc: Likewise. + * a68-low-clauses.cc: Likewise. + * a68-low-ints.cc: Likewise. + * a68-low-multiples.cc: Likewise. + * a68-low-prelude.cc: Likewise. + * a68-low-reals.cc: Likewise. + * a68-low-unions.cc: Likewise. + * a68-low-units.cc: Likewise. + * a68-low.cc: Likewise. + +2026-09-25 Jose E. Marchesi + + * a68-low-decls.cc (a68_lower_mode_declaration): Use + a68_add_global_decl for mode declarations in public ranges. + +2026-09-25 Jose E. Marchesi + + * a68.h: Add prototypes for a68_add_global_decl and + a68_global_context. + * a68-low-ranges.cc (a68_add_global_decl): New function. + (a68_global_context): Likewise. + +2026-09-24 Jose E. Marchesi + + * a68-parser-moids-equivalence.cc (are_modes_equivalent): Do not + string-compare INDICANTs. + +2026-09-22 Jose E. Marchesi + + * a68-low.cc (lower_module_text): Mark prelude_decl an + postlude_decl as artificial. + +2026-09-21 Jose E. Marchesi + + * a68-parser-modes.cc (a68_resolve_equivalent): Rename from + resolve_equivalent and made global. + (resolve_eq_members): Adapt calls to resolve_equivalent + accordingly. + (resolve_eq_tags): Likewise. + (bind_modes): Likewise. + (compute_derived_modes): Likewise. + * a68.h: Add prototype for a68_resolve_equivalent. + * a68-parser-extract.cc (a68_extract_revelation): Resolve + equivalences in imported modes. + +2026-09-21 Jose E. Marchesi + + * a68-parser-attrs.def (COMPLEX_SYMBOL): Remove. + * a68-parser-bottom-up.cc (reduce_declarers): Remove reduction of + COMPLEX_SYMBOL. + (reduce_declarers): Do not handle COMPLEX_SYMBOL. + * a68-parser.cc (a68_dont_mark_here): Likewise. + +2026-09-20 Jose E. Marchesi + + * a68-low-units.cc (a68_lower_denotation): strtoul can return + errno /= 0 in overflow. + +2026-09-19 Jose E. Marchesi + + * ga68.vw: Typos fixed, section 8.0.1 added, consistent {x} style + to refer to rules within pragmatics. + +2026-09-19 Jose E. Marchesi + + * a68-parser-sprops.cc (make_origin): Initialize properties of the + new origin from a parse node. + (sprops_for_denotation): Pass parse node to make_origin and remove + now superfluous code. + (sprops_for_deproceduring): Likewise. + (sprops_for_proceduring): Likewise. + (sprops_for_loop_clause): Likewise. + (sprops_for_serial_clause): Likewise. + (sprops_for_parallel_clause): Likewise. + (sprops_for_conditional_clause): Likewise. + (sprops_for_case_clause): Likewise. + (sprops_for_collateral_clause): Likewise. + (sprops_for_conformity_clause): Likewise. + (sprops_for_identity_relation): Likewise. + (sprops_for_logical_function): Likewise. + (sprops_for_call): Likewise. + (sprops_for_generator): Likewise. + (sprops_for_formula): Likewise. + (sprops_for_applied_identifier): Likewise. + (sprops_for_assertion): Likewise. + (sprops_for_decl): Likewise. + (sprops_for_unit): Likewise. + +2026-09-19 Jose E. Marchesi + + * a68-parser-sprops.cc (sprops_for_deproceduring): Set BNO. + (sprops_for_proceduring): Likewise. + (sprops_for_loop_clause): Likewise. + (sprops_for_serial_clause): Likewise. + (sprops_for_parallel_clause): Likewise. + (sprops_for_conditional_clause): Likewise. + (sprops_for_case_clause): Likewise. + (sprops_for_collateral_clause): Likewise. + (sprops_for_conformity_clause): Likewise. + (sprops_for_identity_relation): Likewise. + (sprops_for_logical_function): Likewise. + (sprops_for_call): Likewise. + (sprops_for_generator): Likewise. + (sprops_for_formula): Likewise. + (sprops_for_assertion): Likewise. + (sprops_for_decl): Likewise. + (sprops_for_decl): Likewise. + (sprops_for_unit): Likewise. + +2026-09-19 Jose E. Marchesi + + * a68-types.h: Clarify roles of field set by the scope checker in + TAG_T. + +2026-09-19 Jose E. Marchesi + + * a68-parser-scope.cc: Do not claim the scope pass finishes the + parser. + +2026-09-18 Jose E. Marchesi + + * a68.h: Add prototypes for a68_sprops, a68_yields_value and + a68_is_declaration. + * a68-types.h (a68_access): New type. + (a68_kindo): Likewise. + (ORIGIN_T): Likewise. + (ACCESS_T): Likewise. + (NODE_T): Add fields origin and access. + (TAG_T): Likewise. + (ACCESS_NIHIL): Remove. + (ACCESS_CONSTANT): Likewise. + (ACCESS_DIRIDEN): Likewise. + (ACCESS_INDIDEN): Likewise. + (ACCESS_DIRWOST): Likewise. + (DEFLEX): Likewise. + (FLEXO): Likewise. + (BNO): Define. + (DEFLEX): Likewise. + (DIAGO): Likewise. + * a68-parser-sprops.cc: New file. + * a68-parser-attrs.def: New comment. + * a68-parser-bottom-up.cc (reduce_enquiry_clauses): Add a few + comments to improve readability. + * a68-parser.cc (a68_is_declaration): New function. + (a68_yields_value): Likewise. + (a68_parser): Run the sprops pass. + (a68_new_node): Initialize ORIGIN and ACCESS. + (a68_new_tag): Likewise, for tags. + * Make-lang.in (ALGOL68_OBJS): Build algol68/a68-parser-sprops.o. + * a68-parser-debug.cc (a68_dump_parse_tree_1): Show static + properties whenever requested. + * a68-low-clauses.cc: Fix grammar for initialiser series and + closed clause in comments. + * a68-low.cc (a68_low_assignation): Fix comment. + +2026-09-16 Pietro Monteiro + + * a68-parser.cc (a68_get_node_location): Return a location + that covers the whole span of the node. + +2026-09-16 Pietro Monteiro + + * a68-low-bits.cc (a68_bits_elem): Use LINE_NUMBER (p) instead + of NUMBER (LINE (INFO (p))). + * a68-low-chars.cc (a68_char_repr): Likewise. + * a68-low-coercions.cc (a68_lower_uniting): Likewise. + * a68-low-misc.cc (a68_lower_assertion): Likewise. + * a68-low-multiples.cc (a68_multiple_slice): Likewise. + (a68_multiple_single_bound_check): Likewise. + (a68_boundable_dim_check): Likewise. + (a68_multiple_bounds_check): Likewise. + (a68_multiple_bounds_check_equal): Likewise. + * a68-low.cc (a68_checked_indirect_ref): Likewise. + * a68-parser-scanner.cc (new_source_line): Adjust the fields + when creating a LINE_T. + (append_source_line): Add a location_t to the new line. + (append_environ): Track the locations of pre/post-lude. + (read_source_file): Create a linemap for the source file. + (include_files): Create a linemap for included source files. + * a68-parser-top-down.cc (a68_phrase_to_text): Use unsigned + for line numbers. + * a68-parser.cc (a68_get_node_location): Return the location of + the node info line. + (a68_get_line_location): Return the location of the line. + * a68-pretty-print.h (a68_line_format_token): Use the line's + filename to check if it's part of the standard environment. + * a68-types.h (struct LINE_T): Remove filename and number + fields from LINE_T and add location. + (FILENAME): Delete macro. + (LOCATION): New macro. + (LINE_NUMBER): Adjust to use LINE_NO (line). + * a68.h (FILENAME): New function. + (LINE_NO): Likewise. + +2026-09-16 Pietro Monteiro + + * a68-parser-scanner.cc (concatenate_lines): Delete. + (read_source_file): Stop calling concatenate_lines. + (next_char): Skip backslash at the end of lines. + (include_files): Stop calling concatenate_lines. + 2026-09-10 Jose E. Marchesi * a68-low-ranges.cc (a68_pop_range): Do not consolidate refs in diff --git a/gcc/algol68/Make-lang.in b/gcc/algol68/Make-lang.in index 5ad6bec3a20d..bf71433911e6 100644 --- a/gcc/algol68/Make-lang.in +++ b/gcc/algol68/Make-lang.in @@ -82,6 +82,7 @@ ALGOL68_OBJS = algol68/a68-lang.o \ algol68/a68-parser-scanner.o \ algol68/a68-parser-scope.o \ algol68/a68-parser-serial-dsa.o \ + algol68/a68-parser-sprops.o \ algol68/a68-parser-taxes.o \ algol68/a68-parser-top-down.o \ algol68/a68-parser-victal.o \ diff --git a/gcc/algol68/a68-lang.cc b/gcc/algol68/a68-lang.cc index 1cefb08c5abd..77ddbf08788b 100644 --- a/gcc/algol68/a68-lang.cc +++ b/gcc/algol68/a68-lang.cc @@ -222,14 +222,15 @@ a68_build_a68_type_nodes (void) static bool a68_init (void) { + /* Initialize binding contexts. */ + a68_init_ranges (); + build_common_tree_nodes (false); a68_build_a68_type_nodes (); targetm.init_builtins (); build_common_builtin_nodes (); a68_install_builtins (); - /* Initialize binding contexts. */ - a68_init_ranges (); /* Set the type of size_t. */ if (TYPE_MODE (long_unsigned_type_node) == ptr_mode) @@ -399,20 +400,6 @@ a68_getdecls (void) #undef LANG_HOOKS_GETDECLS #define LANG_HOOKS_GETDECLS a68_getdecls -/* Return A68_GLOBAL_CONTEXT, but create it first if need be. */ - -static tree -get_global_context (void) -{ - if (!A68_GLOBAL_CONTEXT) - { - A68_GLOBAL_CONTEXT = build_translation_unit_decl (NULL_TREE); - debug_hooks->register_main_translation_unit (A68_GLOBAL_CONTEXT); - } - - return A68_GLOBAL_CONTEXT; -} - /* Implements the lang_hooks.decls.pushdecl routine. Record DECL as belonging to the current lexical scope. */ @@ -426,7 +413,7 @@ pushdecl (tree decl) if (current_function_decl) DECL_CONTEXT (decl) = current_function_decl; else - DECL_CONTEXT (decl) = get_global_context (); + DECL_CONTEXT (decl) = a68_range_context (); } /* Put decls on list in reverse order. */ diff --git a/gcc/algol68/a68-low-bits.cc b/gcc/algol68/a68-low-bits.cc index 1857b830cb16..12b91cd66699 100644 --- a/gcc/algol68/a68-low-bits.cc +++ b/gcc/algol68/a68-low-bits.cc @@ -216,7 +216,7 @@ a68_bits_elem (NODE_T *p, tree pos, tree bits) /* Do bounds checking if requested. */ if (OPTION_BOUNDS_CHECKING (&A68_JOB)) { - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -225,10 +225,10 @@ a68_bits_elem (NODE_T *p, tree pos, tree bits) filename, build_int_cst (unsigned_type_node, lineno), fold_convert (ssizetype, pos)); - tree check = fold_build2 (TRUTH_AND_EXPR, integer_type_node, - fold_build2 (GT_EXPR, integer_type_node, + tree check = fold_build2 (TRUTH_AND_EXPR, a68_int_type, + fold_build2 (GT_EXPR, a68_int_type, pos, fold_convert (TREE_TYPE (pos), integer_zero_node)), - fold_build2 (LE_EXPR, integer_type_node, + fold_build2 (LE_EXPR, a68_int_type, fold_convert (bitsizetype, pos), TYPE_SIZE (TREE_TYPE (bits)))); @@ -298,7 +298,7 @@ a68_bits_shift (NODE_T *p, tree shift, tree bits) tree a68_bits_eq (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, EQ_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, EQ_EXPR, a68_bool_type, a, b); } /* Given two bits values, build an expression that calculates whether A /= @@ -307,7 +307,7 @@ a68_bits_eq (tree a, tree b, location_t loc) tree a68_bits_ne (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, NE_EXPR, a68_bool_type, a, b); } /* Set the bit NUMBIT in BITS. diff --git a/gcc/algol68/a68-low-bools.cc b/gcc/algol68/a68-low-bools.cc index 000e919407d9..f8df5233ad9f 100644 --- a/gcc/algol68/a68-low-bools.cc +++ b/gcc/algol68/a68-low-bools.cc @@ -64,7 +64,7 @@ a68_bool_abs (tree val) tree a68_bool_eq (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, EQ_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, EQ_EXPR, a68_bool_type, a, b); } /* Given two boolean values, build an expression that calculates whether A /= @@ -73,5 +73,5 @@ a68_bool_eq (tree a, tree b, location_t loc) tree a68_bool_ne (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, NE_EXPR, a68_bool_type, a, b); } diff --git a/gcc/algol68/a68-low-chars.cc b/gcc/algol68/a68-low-chars.cc index 90aa6f547ecd..b60b0ec3127c 100644 --- a/gcc/algol68/a68-low-chars.cc +++ b/gcc/algol68/a68-low-chars.cc @@ -72,24 +72,24 @@ a68_char_repr (NODE_T *p, tree val) tree val_type = TREE_TYPE (val); /* (c >= 0 && c < 0xd800) */ - tree range1 = fold_build2 (TRUTH_AND_EXPR, integer_type_node, - fold_build2 (GE_EXPR, integer_type_node, + tree range1 = fold_build2 (TRUTH_AND_EXPR, a68_int_type, + fold_build2 (GE_EXPR, a68_int_type, c, fold_convert (val_type, integer_zero_node)), - fold_build2 (LT_EXPR, integer_type_node, + fold_build2 (LT_EXPR, a68_int_type, c, build_int_cst (val_type, 0xd800))); /* (c >= 0xe000 && c < 0x110000) */ - tree range2 = fold_build2 (TRUTH_AND_EXPR, integer_type_node, - fold_build2 (GE_EXPR, integer_type_node, + tree range2 = fold_build2 (TRUTH_AND_EXPR, a68_int_type, + fold_build2 (GE_EXPR, a68_int_type, c, build_int_cst (val_type, 0xe000)), - fold_build2 (LT_EXPR, integer_type_node, + fold_build2 (LT_EXPR, a68_int_type, c, build_int_cst (val_type, 0x110000))); tree notvalid = fold_build1 (TRUTH_NOT_EXPR, - integer_type_node, - fold_build2 (TRUTH_OR_EXPR, integer_type_node, + a68_int_type, + fold_build2 (TRUTH_OR_EXPR, a68_int_type, range1, range2)); /* Call to the runtime run-time error handler. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -101,7 +101,7 @@ a68_char_repr (NODE_T *p, tree val) /* Return the REPR of the given integer value, or raise run-time error. */ return fold_build2 (COMPOUND_EXPR, a68_char_type, - fold_build3 (COND_EXPR, integer_type_node, + fold_build3 (COND_EXPR, a68_int_type, notvalid, call, integer_zero_node), fold_convert (a68_char_type, c)); @@ -121,7 +121,7 @@ a68_char_abs (tree val) tree a68_char_eq (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, EQ_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, EQ_EXPR, a68_bool_type, a, b); } /* Given two characters, build an expression that calculates whether A /= @@ -130,7 +130,7 @@ a68_char_eq (tree a, tree b, location_t loc) tree a68_char_ne (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, NE_EXPR, a68_bool_type, a, b); } /* Given two characters, build an expression that calculates @@ -139,7 +139,7 @@ a68_char_ne (tree a, tree b, location_t loc) tree a68_char_lt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LT_EXPR, a68_bool_type, a, b); } /* Given two characters, build an expression that calculates @@ -148,7 +148,7 @@ a68_char_lt (tree a, tree b, location_t loc) tree a68_char_le (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LE_EXPR, a68_bool_type, a, b); } /* Given two characters, build an expression that calculates @@ -157,7 +157,7 @@ a68_char_le (tree a, tree b, location_t loc) tree a68_char_gt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GT_EXPR, a68_bool_type, a, b); } /* Given two characters, build an expression that calculates @@ -166,5 +166,5 @@ a68_char_gt (tree a, tree b, location_t loc) tree a68_char_ge (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GE_EXPR, a68_bool_type, a, b); } diff --git a/gcc/algol68/a68-low-clauses.cc b/gcc/algol68/a68-low-clauses.cc index e67318100125..168b3f49fe52 100644 --- a/gcc/algol68/a68-low-clauses.cc +++ b/gcc/algol68/a68-low-clauses.cc @@ -164,10 +164,9 @@ a68_lower_completer (NODE_T *p ATTRIBUTE_UNUSED, LOW_CTX_T ctx ATTRIBUTE_UNUSED) Parse tree: - initialiser series : serial clause, semi symbol, declaration list; - initialiser series, declaration list; - initialiser series, semi symbol, unit; - initialiser series, semi symbol, labeled unit; + initialiser series : declaration list; + serial clause, semi symbol, declaration list; + enquiry clause, semi symbol, declaration list; initialiser series, semi symbol, declaration list. GENERIC: @@ -196,7 +195,6 @@ a68_lower_initialiser_series (NODE_T *p, LOW_CTX_T ctx) unit; serial clause, semi symbol, unit; serial clause, exit symbol, labeled unit; - serial clause, semi_symbol, declaration list; initialiser series, semi symbol, unit; initialiser series, semi symbol, labeled unit. @@ -230,8 +228,7 @@ a68_lower_serial_clause (NODE_T *p, LOW_CTX_T ctx) } else { - /* Append the result of either the unit or the declarations list in - the current statements list. */ + /* Append the result of the unit in the current statements list. */ a68_add_stmt (a68_lower_tree (NEXT (NEXT (SUB (p))), ctx)); } } @@ -240,8 +237,8 @@ a68_lower_serial_clause (NODE_T *p, LOW_CTX_T ctx) /* Traverse down for side-effects. */ (void) a68_lower_tree (SUB (p), ctx); - /* Append the result of either the unit or the declarations list in the - current statements list. */ + /* Append the result of the unit or labeled unit in the current + statements list. */ a68_add_stmt (a68_lower_tree (NEXT (NEXT (SUB (p))), ctx)); } else @@ -378,7 +375,7 @@ a68_lower_loop_clause (NODE_T *p ATTRIBUTE_UNUSED, to_part = a68_lower_tmpvar ("to_part%", TREE_TYPE (to_part), to_part); /* We need to detect overflow/underflow of the iterator. */ - overflow = a68_lower_tmpvar ("overflow%", boolean_type_node, + overflow = a68_lower_tmpvar ("overflow%", a68_bool_type, boolean_false_node); } @@ -406,7 +403,7 @@ a68_lower_loop_clause (NODE_T *p ATTRIBUTE_UNUSED, tree exit_condition = NULL_TREE; /* IF overflow OREL (by_part < 0 THEN iterator < to_part ELSE iterator > to_part) FI */ if (has_iterator) - exit_condition = fold_build2 (TRUTH_ORIF_EXPR, boolean_type_node, + exit_condition = fold_build2 (TRUTH_ORIF_EXPR, a68_bool_type, overflow, fold_build3 (COND_EXPR, a68_bool_type, @@ -452,9 +449,9 @@ a68_lower_loop_clause (NODE_T *p ATTRIBUTE_UNUSED, tree a = iterator; tree b = save_expr (by_part); tree sum = fold_build2 (PLUS_EXPR, type, a, b); - a68_add_stmt (fold_build2 (MODIFY_EXPR, boolean_type_node, + a68_add_stmt (fold_build2 (MODIFY_EXPR, a68_bool_type, overflow, - fold_build2 (LT_EXPR, boolean_type_node, + fold_build2 (LT_EXPR, a68_bool_type, fold_build2 (BIT_AND_EXPR, type, fold_build1 (BIT_NOT_EXPR, type, fold_build2 (BIT_XOR_EXPR, type, @@ -540,14 +537,14 @@ lower_unite_case_unit (NODE_T *p, { int index = a68_united_mode_index (enquiry_mode, MOID (pack)); tree expr = fold_build2 (EQ_EXPR, - boolean_type_node, + a68_bool_type, overhead, build_int_cst (TREE_TYPE (overhead), index)); if (entry_selected == NULL_TREE) entry_selected = expr; else entry_selected = fold_build2 (TRUTH_OR_EXPR, - boolean_type_node, + a68_bool_type, entry_selected, expr); } @@ -1369,9 +1366,7 @@ a68_lower_parallel_clause (NODE_T *p ATTRIBUTE_UNUSED, /* Lower a closed clause. closed clause : open symbol, serial clause, close symbol; - open symbol, initialiser series, close symbol; - begin symbol, serial clause, end symbol; - begin symbol, initialiser series, end symbol; + begin symbol, serial clause, end symbol. This function returns a BIND_EXPR. */ diff --git a/gcc/algol68/a68-low-coercions.cc b/gcc/algol68/a68-low-coercions.cc index 3941917223f0..54079122880d 100644 --- a/gcc/algol68/a68-low-coercions.cc +++ b/gcc/algol68/a68-low-coercions.cc @@ -117,7 +117,7 @@ a68_lower_uniting (NODE_T *p, LOW_CTX_T ctx) /* This should not be reached. Emit run-time error. */ { - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); diff --git a/gcc/algol68/a68-low-decls.cc b/gcc/algol68/a68-low-decls.cc index 532f5b65c3bc..606e5fdf5efd 100644 --- a/gcc/algol68/a68-low-decls.cc +++ b/gcc/algol68/a68-low-decls.cc @@ -42,6 +42,52 @@ #include "a68.h" +/* Auxiliary function to fish a declarer from some software construct. The + first declarer found is returned, or NULL_TREE if none is found. */ + +static NODE_T * +fish_declarer_from_tree (NODE_T *p) +{ + for (; p != NO_NODE; p = NEXT (p)) + { + if (IS (p, DECLARER)) + return p; + + NODE_T *declarer = fish_declarer_from_tree (SUB (p)); + if (declarer != NO_NODE) + return declarer; + } + + return NO_NODE; +} + +/* If the given DECLARER is an indicant whose symtab entry is annotated with a + CTYPE, then it is a typedef type derived from the type installed in the + given DECL. The derived type was created and installed in the symtab entry + by a68_lower_mode_declaration. Install it in DECL so the typedef gets + reflected intthe DWARF that gets generated for DECL. */ + +static void +grok_typedef_in_decl (tree decl, NODE_T *declarer, bool use_pointer = false) +{ + if (SUB (declarer) != NO_NODE && IS (SUB (declarer), INDICANT)) + { + NODE_T *indicant = SUB (declarer); + + /* Note that indicants for standard modes do not have symtab entries. */ + if (TAX (indicant) != NO_TAG && CTYPE (TAX (indicant)) != NULL_TREE) + { + if (use_pointer) + { + gcc_assert (POINTER_TYPE_P (TREE_TYPE (decl))); + TREE_TYPE (TREE_TYPE (decl)) = CTYPE (TAX (indicant)); + } + else + TREE_TYPE (decl) = CTYPE (TAX (indicant)); + } + } +} + /* Lower one or more mode declarations. mode declaration : mode symbol, defining indicant, @@ -57,11 +103,9 @@ mode declaration, comma symbol, defining indicant, equals symbol, void symbol. - Each mode declaration lowers into a TYPE_DECL, which are chained in the - current block. This function returns void_node. - - Note that the defining indicant is already annotated with the declared mode - so there is no need to go hunting for the declarer in the subtree. */ + Each mode declaration lowers into a TYPE_DECL so the mode is reflected in + the debug info. This is done by linking the decl to the type via + TYPE_STUB_DECL and by filling in the TYPE_NAME of the base type. */ tree a68_lower_mode_declaration (NODE_T *p, LOW_CTX_T ctx) @@ -87,19 +131,34 @@ a68_lower_mode_declaration (NODE_T *p, LOW_CTX_T ctx) } } - /* Create a TYPE_DECL declaration for the defined mode and chain it in the - current block. */ - tree ctype = CTYPE (MOID (defining_indicant)); + tree type = CTYPE (MOID (defining_indicant)); tree decl_name = a68_get_mangled_indicant (NSYMBOL (defining_indicant), - ctx.module_definition_name); + ctx.module_definition_name); tree decl = build_decl (a68_get_node_location (p), - TYPE_DECL, decl_name, ctype); + TYPE_DECL, decl_name, type); SET_DECL_ASSEMBLER_NAME (decl, decl_name); TREE_PUBLIC (decl) = 1; - TYPE_CONTEXT (ctype) = DECL_CONTEXT (decl); - TYPE_NAME (ctype) = decl; - TYPE_STUB_DECL (ctype) = decl; - a68_add_decl (decl); + + if (PUBLIC_RANGE (TABLE (TAX (defining_indicant)))) + a68_add_global_decl (decl); + else + a68_add_decl (decl); + + DECL_ORIGINAL_TYPE (decl) = type; + + tree variant_type = build_variant_type_copy (type); + TYPE_STUB_DECL (variant_type) = TYPE_STUB_DECL (type); + TYPE_NAME (variant_type) = decl; + TREE_TYPE (decl) = variant_type; + + TYPE_CONTEXT (type) = DECL_CONTEXT (decl); + TYPE_CONTEXT (variant_type) = TYPE_CONTEXT (type); + + /* Install the derived typedef type in the symtab entry for the + defining-indicant, so the lowerers for identity declarations, variable + declarations, etc, having the indicant as declarer, can use this type + rather than the original type. */ + CTYPE (TAX (defining_indicant)) = variant_type; return void_node; } @@ -133,10 +192,7 @@ a68_lower_mode_declaration (NODE_T *p, LOW_CTX_T ctx) HEAP generator, however, then the VAR_DECL declares a value of type pointer to CTYPE (AMODE0. In this later case no optimization is possible and it has exactly the same effect than an identity declaration `REF AMODE - defining_identifier = HEAP AMODE'. - - Note that the defining identifier is annotated with its mode, so there is no - need to go hunting for the declarer in the subtree. */ + defining_identifier = HEAP AMODE'. */ tree a68_lower_variable_declaration (NODE_T *p, LOW_CTX_T ctx) @@ -144,6 +200,8 @@ a68_lower_variable_declaration (NODE_T *p, LOW_CTX_T ctx) NODE_T *defining_identifier, *unit; NODE_T *declarer = NO_NODE; + // XXX this is better than using ctx NODE_T *declarer = fish_declarer_from_tree (p); + tree sub_expr = NULL_TREE; if (IS (SUB (p), VARIABLE_DECLARATION)) @@ -159,7 +217,7 @@ a68_lower_variable_declaration (NODE_T *p, LOW_CTX_T ctx) if (IS (q, PUBLIC_SYMBOL)) FORWARD (q); - + if (IS (q, QUALIFIER)) { /* The qualifier determines what kind of generator is used in the @@ -177,6 +235,9 @@ a68_lower_variable_declaration (NODE_T *p, LOW_CTX_T ctx) gcc_unreachable (); } + gcc_assert (declarer != NO_NODE); + gcc_assert (defining_identifier != NO_NODE); + /* Communicate declarer upward. */ if (ctx.declarer != NULL) *ctx.declarer = declarer; @@ -211,6 +272,12 @@ a68_lower_variable_declaration (NODE_T *p, LOW_CTX_T ctx) else a68_add_decl (var_decl); + // XXX sucks to replicate this logic here. + bool use_pointer = (HEAP (TAX (defining_identifier)) != STATIC_SYMBOL + && ((HEAP (TAX (defining_identifier)) == HEAP_SYMBOL) + || HAS_ROWS (SUB (MOID (defining_identifier))))); + grok_typedef_in_decl (var_decl, declarer, use_pointer); + /* Add a decl_expr in the current range. */ a68_add_decl_expr (fold_build1_loc (a68_get_node_location (p), DECL_EXPR, @@ -328,9 +395,7 @@ a68_lower_identity_declaration (NODE_T *p, LOW_CTX_T ctx) tree unit_tree = NULL_TREE; tree sub_expr = NULL_TREE; - /* Note that the formal declarer in the construct is not used. This is - because it is already reflected in the mode of the identity - declaration. */ + NODE_T *declarer = fish_declarer_from_tree (p); NODE_T *defining_identifier; if (IS (SUB (p), IDENTITY_DECLARATION)) @@ -349,6 +414,9 @@ a68_lower_identity_declaration (NODE_T *p, LOW_CTX_T ctx) else gcc_unreachable (); + gcc_assert (declarer != NO_NODE); + gcc_assert (defining_identifier != NO_NODE); + NODE_T *unit = NEXT (NEXT (defining_identifier)); tree expr = NULL_TREE; @@ -383,6 +451,8 @@ a68_lower_identity_declaration (NODE_T *p, LOW_CTX_T ctx) TREE_TYPE (id_decl), id_decl)); + grok_typedef_in_decl (id_decl, declarer); + unit_tree = a68_lower_tree (unit, ctx); unit_tree = a68_consolidate_ref (MOID (unit), unit_tree); expr = a68_low_ascription (MOID (defining_identifier), diff --git a/gcc/algol68/a68-low-ints.cc b/gcc/algol68/a68-low-ints.cc index d80d35e8302b..4bf97e9ebea4 100644 --- a/gcc/algol68/a68-low-ints.cc +++ b/gcc/algol68/a68-low-ints.cc @@ -94,11 +94,11 @@ a68_int_sign (tree val) val = save_expr (val); return fold_build3 (COND_EXPR, a68_int_type, - fold_build2 (EQ_EXPR, integer_type_node, val, zero), + fold_build2 (EQ_EXPR, a68_int_type, val, zero), build_int_cst (a68_int_type, 0), fold_build3 (COND_EXPR, a68_int_type, - fold_build2 (GT_EXPR, integer_type_node, val, zero), + fold_build2 (GT_EXPR, a68_int_type, val, zero), build_int_cst (a68_int_type, 1), build_int_cst (a68_int_type, -1))); } @@ -193,7 +193,7 @@ a68_int_div (MOID_T *m, tree a, tree b, location_t loc) tree a68_int_eq (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, EQ_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, EQ_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build an expression that calculates @@ -202,7 +202,7 @@ a68_int_eq (tree a, tree b, location_t loc) tree a68_int_ne (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, NE_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build an expression that calculates @@ -211,7 +211,7 @@ a68_int_ne (tree a, tree b, location_t loc) tree a68_int_lt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LT_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build an expression that calculates @@ -220,7 +220,7 @@ a68_int_lt (tree a, tree b, location_t loc) tree a68_int_le (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LE_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build an expression that calculates @@ -229,7 +229,7 @@ a68_int_le (tree a, tree b, location_t loc) tree a68_int_gt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GT_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build an expression that calculates @@ -238,7 +238,7 @@ a68_int_gt (tree a, tree b, location_t loc) tree a68_int_ge (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GE_EXPR, a68_bool_type, a, b); } /* Given two integral values of mode M, build and expression that calculates the diff --git a/gcc/algol68/a68-low-misc.cc b/gcc/algol68/a68-low-misc.cc index b1048b6b8ca8..8d0d157e5b38 100644 --- a/gcc/algol68/a68-low-misc.cc +++ b/gcc/algol68/a68-low-misc.cc @@ -54,7 +54,7 @@ a68_lower_assertion (NODE_T *p, LOW_CTX_T ctx) return a68_get_empty(); /* Build the call to the assert run-time function. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); diff --git a/gcc/algol68/a68-low-moids.cc b/gcc/algol68/a68-low-moids.cc index 27b28173003f..54c1a42863d9 100644 --- a/gcc/algol68/a68-low-moids.cc +++ b/gcc/algol68/a68-low-moids.cc @@ -49,23 +49,6 @@ static tree a68_lower_mode (MOID_T *m); This is used for TYPE_STUB_DECL so we can generate debug info for all our modes, so the TYPE_DECL has no name. */ -static void -build_stub_type_decl (tree type, tree context) -{ - if (TYPE_STUB_DECL (type)) - return; - - tree decl = build_decl (UNKNOWN_LOCATION, - TYPE_DECL, - NULL_TREE /* name */, - type); - TREE_PUBLIC (decl) = 1; - DECL_CONTEXT (decl) = context; - TYPE_CONTEXT (type) = DECL_CONTEXT (decl); - TYPE_NAME (type) = decl; /* Weird. This is for typedefs! */ - TYPE_STUB_DECL (type) = decl; -} - /* Builds a record type whose name is NAME. NFIELDS is the number of fields, provided as field ident/type pairs. @@ -311,10 +294,6 @@ lower_struct_mode (MOID_T *m) compute_record_mode (struct_type); } - /* Finish debugging output for this type. */ - build_stub_type_decl (struct_type, NULL_TREE /* context */); - rest_of_type_compilation (struct_type, TYPE_FILE_SCOPE_P (struct_type)); - rest_of_decl_compilation (TYPE_NAME (struct_type), 1 /* file scope p */, 0); A68_STRUCT_TYPE_P (struct_type) = 1; return struct_type; } @@ -429,11 +408,6 @@ lower_union_mode (MOID_T *m) compute_record_mode (c_union_type); } - /* Finish debugging output for this type. */ - build_stub_type_decl (c_union_type, NULL_TREE /* context */); - rest_of_type_compilation (c_union_type, TYPE_FILE_SCOPE_P (c_union_type)); - rest_of_decl_compilation (TYPE_NAME (c_union_type), 1 /* file scope p */, 0); - /* Now the type with the overhead. */ TYPE_NAME (union_type) = get_identifier ("union%"); tree overhead_field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, diff --git a/gcc/algol68/a68-low-multiples.cc b/gcc/algol68/a68-low-multiples.cc index b72f8bbb89a2..fb1683eeac2c 100644 --- a/gcc/algol68/a68-low-multiples.cc +++ b/gcc/algol68/a68-low-multiples.cc @@ -525,7 +525,7 @@ a68_multiple_slice (NODE_T *p, if (OPTION_BOUNDS_CHECKING (&A68_JOB)) { tree upper_bound = a68_multiple_upper_bound (multiple, size_int (idx)); - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -544,7 +544,7 @@ a68_multiple_slice (NODE_T *p, fold_build2 (LE_EXPR, ssizetype, lower_bound, upper_bound), fold_build2 (TRUTH_AND_EXPR, - boolean_type_node, + a68_bool_type, fold_build2 (GE_EXPR, ssizetype, fold_convert (ssizetype, index_expr), @@ -858,7 +858,7 @@ a68_multiple_single_bound_check (NODE_T *p, tree dim, : A68_LIBCALL_ARRAYLOWERBOUND); /* Build the call to ARRAY*BOUNDS. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -897,7 +897,7 @@ a68_boundable_dim_check (NODE_T *p, tree boundable_dim, tree dim) dim = save_expr (dim); /* Build the call to ARRAYDIM. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -908,9 +908,9 @@ a68_boundable_dim_check (NODE_T *p, tree boundable_dim, tree dim) boundable_dim, dim); call = fold_build2 (COMPOUND_EXPR, a68_bool_type, call, boolean_false_node); - tree dim_check = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, - fold_build2 (GT_EXPR, boolean_type_node, dim, size_zero_node), - fold_build2 (LE_EXPR, boolean_type_node, dim, boundable_dim)); + tree dim_check = fold_build2 (TRUTH_AND_EXPR, a68_bool_type, + fold_build2 (GT_EXPR, a68_bool_type, dim, size_zero_node), + fold_build2 (LE_EXPR, a68_bool_type, dim, boundable_dim)); return fold_build2_loc (a68_get_node_location (p), TRUTH_ORIF_EXPR, ssizetype, @@ -965,7 +965,7 @@ a68_multiple_bounds_check (NODE_T *p, tree dim, tree lower_bound = a68_multiple_lower_bound (multiple, dim); /* Build the call to ARRAYBOUNDS. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -984,7 +984,7 @@ a68_multiple_bounds_check (NODE_T *p, tree dim, fold_build2 (LE_EXPR, ssizetype, lower_bound, upper_bound), fold_build2 (TRUTH_AND_EXPR, - boolean_type_node, + a68_bool_type, fold_build2 (GE_EXPR, ssizetype, fold_convert (ssizetype, index), @@ -1037,13 +1037,13 @@ a68_multiple_bounds_check_equal (NODE_T *p, tree m1, tree m2) tree ub2 = save_expr (a68_multiple_upper_bound (m2, dim_tree)); tree bounds_equal = fold_build2 (TRUTH_AND_EXPR, - boolean_type_node, - fold_build2 (EQ_EXPR, boolean_type_node, + a68_bool_type, + fold_build2 (EQ_EXPR, a68_bool_type, lb1, lb2), - fold_build2 (EQ_EXPR, boolean_type_node, + fold_build2 (EQ_EXPR, a68_bool_type, ub1, ub2)); - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -1053,10 +1053,10 @@ a68_multiple_bounds_check_equal (NODE_T *p, tree m1, tree m2) build_int_cst (unsigned_type_node, lineno), dim_plus_one, lb1, ub1, lb2, ub2); - call = fold_build2 (COMPOUND_EXPR, boolean_type_node, call, boolean_false_node); + call = fold_build2 (COMPOUND_EXPR, a68_bool_type, call, boolean_false_node); tree check = fold_build2_loc (a68_get_node_location (p), - TRUTH_ORIF_EXPR, boolean_type_node, + TRUTH_ORIF_EXPR, a68_bool_type, bounds_equal, call); a68_add_stmt (check); diff --git a/gcc/algol68/a68-low-prelude.cc b/gcc/algol68/a68-low-prelude.cc index 804febf2c613..eea57ae666cc 100644 --- a/gcc/algol68/a68-low-prelude.cc +++ b/gcc/algol68/a68-low-prelude.cc @@ -731,7 +731,7 @@ elems (NODE_T *p, tree boundable, tree dim) size_one_node); tree elems = fold_build3 (COND_EXPR, sizetype, - fold_build2 (LT_EXPR, boolean_type_node, + fold_build2 (LT_EXPR, a68_bool_type, upper_bound, lower_bound), size_zero_node, non_flat); diff --git a/gcc/algol68/a68-low-ranges.cc b/gcc/algol68/a68-low-ranges.cc index 70e189344d97..5ccc4935998f 100644 --- a/gcc/algol68/a68-low-ranges.cc +++ b/gcc/algol68/a68-low-ranges.cc @@ -253,6 +253,27 @@ a68_add_stmt (tree exp) ¤t_range->stmt_list); } +/* Add a new declaration to the global range. */ + +void +a68_add_global_decl (tree decl) +{ + gcc_assert (current_range != NULL); + + tree n = global_range->names; + while (n != decl && n != NULL) + n = TREE_CHAIN (n); + if (n != decl) + { + if (decl != current_function_decl) + DECL_CONTEXT (decl) = global_range->context; + /* Note this list needs to be in reverse order for compatibility with + GCC. */ + TREE_CHAIN (decl) = global_range->names; + global_range->names = decl; + } +} + /* Add a new declaration to the current range. */ void @@ -332,6 +353,14 @@ a68_range_context (void) return current_range->context; } +/* Get the global context. */ + +tree +a68_global_context (void) +{ + return global_range->context; +} + /* Get the list of declarations in the current range. */ tree @@ -588,19 +617,24 @@ a68_pop_serial_clause_range (void) same than the type corresponding to the clause mode. */ { tree_stmt_iterator si = tsi_last (range->stmt_list); - if (TREE_TYPE (tsi_stmt (si)) != clause_type + tree last_stmt_type = TREE_TYPE (tsi_stmt (si)); + + /* We need original type to compare below. */ + if (typedef_variant_p (last_stmt_type)) + last_stmt_type = DECL_ORIGINAL_TYPE (TYPE_NAME (last_stmt_type)); + + if (last_stmt_type != clause_type /* But NIL can appear in a context expecting VOID with no widening. */ && !(clause_type == a68_void_type - && POINTER_TYPE_P (TREE_TYPE (tsi_stmt (si))) + && POINTER_TYPE_P (last_stmt_type) && TREE_CODE (tsi_stmt (si)) == INTEGER_CST && tree_to_shwi (tsi_stmt (si)) == 0) /* And any row type is valid when M_ROWS is expected. */ - && !(A68_ROWS_TYPE_P (clause_type) - && A68_ROWS_TYPE_P (TREE_TYPE (tsi_stmt (si)))) + && !(A68_ROWS_TYPE_P (clause_type) && A68_ROWS_TYPE_P (last_stmt_type)) /* Do not rely on comparing pointer types, as the equality fails in that case. We need a better way of comparing types, either using TYPE_CANONICAL or caching. */ - && !(POINTER_TYPE_P (TREE_TYPE (tsi_stmt (si))) && POINTER_TYPE_P (clause_type))) + && !(POINTER_TYPE_P (last_stmt_type) && POINTER_TYPE_P (clause_type))) { printf ("last statement:\n"); debug_tree (tsi_stmt (si)); diff --git a/gcc/algol68/a68-low-reals.cc b/gcc/algol68/a68-low-reals.cc index 418fbc8b796a..f24add7b43f1 100644 --- a/gcc/algol68/a68-low-reals.cc +++ b/gcc/algol68/a68-low-reals.cc @@ -140,11 +140,11 @@ a68_real_sign (tree val) val = save_expr (val); return fold_build3 (COND_EXPR, a68_int_type, - build2 (EQ_EXPR, integer_type_node, val, zero), + build2 (EQ_EXPR, a68_int_type, val, zero), build_int_cst (a68_int_type, 0), fold_build3 (COND_EXPR, a68_int_type, - fold_build2 (GT_EXPR, integer_type_node, val, zero), + fold_build2 (GT_EXPR, a68_int_type, val, zero), build_int_cst (a68_int_type, 1), build_int_cst (a68_int_type, -1))); } @@ -507,7 +507,7 @@ a68_real_div (MOID_T *m, tree a, tree b, location_t loc) tree a68_real_eq (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, EQ_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, EQ_EXPR, a68_bool_type, a, b); } /* Given two real values of mode M, build an expression that calculates whether @@ -516,7 +516,7 @@ a68_real_eq (tree a, tree b, location_t loc) tree a68_real_ne (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, NE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, NE_EXPR, a68_bool_type, a, b); } /* Given two real values of mode M, build an expression that calculates whether @@ -525,7 +525,7 @@ a68_real_ne (tree a, tree b, location_t loc) tree a68_real_lt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LT_EXPR, a68_bool_type, a, b); } /* Given two real values of mode M, build an expression that calculates @@ -534,7 +534,7 @@ a68_real_lt (tree a, tree b, location_t loc) tree a68_real_le (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, LE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, LE_EXPR, a68_bool_type, a, b); } /* Given two real values of mode M, build an expression that calculates whether @@ -543,7 +543,7 @@ a68_real_le (tree a, tree b, location_t loc) tree a68_real_gt (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GT_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GT_EXPR, a68_bool_type, a, b); } /* Given two real values of mode M, build an expression that calculates whether @@ -552,7 +552,7 @@ a68_real_gt (tree a, tree b, location_t loc) tree a68_real_ge (tree a, tree b, location_t loc) { - return fold_build2_loc (loc, GE_EXPR, boolean_type_node, a, b); + return fold_build2_loc (loc, GE_EXPR, a68_bool_type, a, b); } /* Exponentiation involving real values. diff --git a/gcc/algol68/a68-low-unions.cc b/gcc/algol68/a68-low-unions.cc index f775877f3271..7b84be014667 100644 --- a/gcc/algol68/a68-low-unions.cc +++ b/gcc/algol68/a68-low-unions.cc @@ -126,7 +126,7 @@ a68_union_translate_overhead (MOID_T *from, tree from_overhead, if (a68_union_contains_mode (to, mode)) { to_overhead = fold_build3 (COND_EXPR, sizetype, - fold_build2 (EQ_EXPR, boolean_type_node, + fold_build2 (EQ_EXPR, a68_bool_type, from_overhead, size_int (i)), size_int (a68_united_mode_index (to, mode)), diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc index ed92a1fd5178..b53a1c1b50fe 100644 --- a/gcc/algol68/a68-low-units.cc +++ b/gcc/algol68/a68-low-units.cc @@ -301,8 +301,7 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx) #else uint64_t val = strtoull (end, &end, radix); #endif - gcc_assert (errno == 0 && end[0] == '\0'); - + gcc_assert (end[0] == '\0'); uint64_t max_positive = uint64_t (wi::max_value (type).to_uhwi ()); if (errno == ERANGE || val > max_positive) { @@ -325,11 +324,11 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx) s = SUB (p); if (moid == M_REAL) - type = float_type_node; + type = a68_real_type; else if (moid == M_LONG_REAL) - type = double_type_node; + type = a68_long_real_type; else if (moid == M_LONG_LONG_REAL) - type = long_double_type_node; + type = a68_long_long_real_type; else gcc_unreachable (); @@ -413,7 +412,7 @@ a68_lower_identity_relation (NODE_T *p, LOW_CTX_T ctx) gcc_unreachable (); return fold_build2_loc (a68_get_node_location (p), - code, boolean_type_node, op1, op2); + code, a68_bool_type, op1, op2); } /* Lower AND_FUNCTION and OR_FUNCTION. @@ -446,7 +445,7 @@ a68_lower_logic_function (NODE_T *p, LOW_CTX_T ctx) gcc_unreachable (); return fold_build2_loc (a68_get_node_location (p), - code, boolean_type_node, op1, op2); + code, a68_bool_type, op1, op2); } /* Lower a primary. diff --git a/gcc/algol68/a68-low.cc b/gcc/algol68/a68-low.cc index 40636601c036..1c4ab2b2344e 100644 --- a/gcc/algol68/a68-low.cc +++ b/gcc/algol68/a68-low.cc @@ -628,7 +628,7 @@ a68_make_variable_declaration_decl (NODE_T *identifier, If ADDRP is true then it is the address of the external symbol we are interested in. In that case the mode of P shall be a ref. - + Note that this function is not used for formal holes with proc modes, called from a68_wrap_formal_var_hole. See a68_wrap_formal_proc_hole. */ @@ -673,7 +673,7 @@ a68_checked_indirect_ref (NODE_T *p, tree exp, MOID_T *exp_mode) tree consolidated_exp = a68_consolidate_ref (exp_mode, exp); /* Check whether we are dereferencing NIL. */ - unsigned int lineno = NUMBER (LINE (INFO (p))); + unsigned int lineno = LINE_NUMBER (p); const char *filename_str = FILENAME (LINE (INFO (p))); tree filename = build_string_literal (strlen (filename_str) + 1, filename_str); @@ -916,13 +916,13 @@ a68_low_dup (tree expr, bool use_heap) a68_add_decl (continue_label_decl); a68_add_stmt (fold_build2 (TRUTH_ORIF_EXPR, - integer_type_node, + a68_int_type, fold_build2 (EQ_EXPR, - integer_type_node, + a68_int_type, a68_union_overhead (dup), size_int (a68_united_mode_index (union_mode, MOID (pack)))), fold_build2 (COMPOUND_EXPR, - integer_type_node, + a68_int_type, build1 (GOTO_EXPR, void_type_node, continue_label_decl), integer_zero_node))); a68_add_stmt (fold_build2 (MODIFY_EXPR, type, @@ -993,6 +993,11 @@ a68_low_assignation (NODE_T *p, tree assignation = NULL_TREE; tree orig_rhs = rhs; + /* The lhs might be a selection that has been "ref_consolidated". */ + if (TREE_CODE (lhs) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (lhs, 0)) == COMPONENT_REF) + lhs = TREE_OPERAND (lhs, 0); + if (IS_FLEXETY_ROW (mode_rhs)) { /* Make a deep copy of the rhs. Note that we have to use the heap @@ -1011,7 +1016,8 @@ a68_low_assignation (NODE_T *p, is performed. XXX but bound checking in contained values may be necessary, ghost elements. */ if (POINTER_TYPE_P (TREE_TYPE (lhs)) - && TREE_TYPE (TREE_TYPE (lhs)) == TREE_TYPE (rhs)) + && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs))) + == TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))) { /* Make sure to not evaluate the expression yielding the pointer more than once. */ @@ -1051,7 +1057,7 @@ a68_low_assignation (NODE_T *p, else { /* The name at the lhs is either a variable or a component ref as - a l-value. It is ok to evaluate it as an r-value as well as + an l-value. It is ok to evaluate it as an r-value as well as doing so introduces no side-effects. */ effective_lhs = lhs; } @@ -1091,7 +1097,8 @@ a68_low_assignation (NODE_T *p, rhs = a68_low_dup (rhs, true /* use_heap */); if (POINTER_TYPE_P (TREE_TYPE (lhs)) - && TREE_TYPE (TREE_TYPE (lhs)) == TREE_TYPE (rhs)) + && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (lhs))) + == TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))) { /* If the left hand side is a pointer, deref it, but return the pointer. Make sure to not evaluate the expression yielding the @@ -1318,6 +1325,7 @@ lower_module_text (NODE_T *p, LOW_CTX_T ctx) DECL_EXTERNAL (prelude_decl) = 0; TREE_PUBLIC (prelude_decl) = 1; TREE_STATIC (prelude_decl) = 1; + DECL_ARTIFICIAL (prelude_decl) = 1; a68_push_function_range (prelude_decl, void_type_node /* result_type */, true /* top_level */); @@ -1376,6 +1384,7 @@ lower_module_text (NODE_T *p, LOW_CTX_T ctx) DECL_EXTERNAL (postlude_decl) = 0; TREE_PUBLIC (postlude_decl) = 1; TREE_STATIC (postlude_decl) = 1; + DECL_ARTIFICIAL (postlude_decl) = 1; a68_push_function_range (postlude_decl, void_type_node /* result_type */, true /* top_level */); diff --git a/gcc/algol68/a68-parser-attrs.def b/gcc/algol68/a68-parser-attrs.def index 2d615409da1b..6f4e1183e7d1 100644 --- a/gcc/algol68/a68-parser-attrs.def +++ b/gcc/algol68/a68-parser-attrs.def @@ -20,6 +20,9 @@ messages and debug dumps. Please make sure to write them in a way you would expect to be used in statements like "[...] near ATT". */ +/* If you add a new entry, please update the a68_is_* classifier functions in + a68-parser.cc. */ + A68_ATTR(A68_PATTERN, "transput pattern") A68_ATTR(ACCESS_CLAUSE, "access clause") A68_ATTR(ACCESS_SYMBOL, "access-symbol") @@ -85,7 +88,6 @@ A68_ATTR(COLLECTION, "collection") A68_ATTR(COLON_SYMBOL, "colon-symbol") A68_ATTR(COMMA_SYMBOL, "comma-symbol") A68_ATTR(COMPLEX_PATTERN, "complex pattern") -A68_ATTR(COMPLEX_SYMBOL, "complex-symbol") A68_ATTR(COMPL_SYMBOL, "compl-symbol") A68_ATTR(CONDITIONAL_CLAUSE, "conditional clause") A68_ATTR(CONFORMITY_CHOICE, "conformity clause choice") diff --git a/gcc/algol68/a68-parser-bottom-up.cc b/gcc/algol68/a68-parser-bottom-up.cc index ccbcba93211d..0ddf1f63fa88 100644 --- a/gcc/algol68/a68-parser-bottom-up.cc +++ b/gcc/algol68/a68-parser-bottom-up.cc @@ -773,7 +773,6 @@ reduce_declarers (NODE_T *p, enum a68_attribute expect) reduce (q, NO_NOTE, NO_TICK, INDICANT, REAL_SYMBOL, STOP); reduce (q, NO_NOTE, NO_TICK, INDICANT, BITS_SYMBOL, STOP); reduce (q, NO_NOTE, NO_TICK, INDICANT, BYTES_SYMBOL, STOP); - reduce (q, NO_NOTE, NO_TICK, INDICANT, COMPLEX_SYMBOL, STOP); reduce (q, NO_NOTE, NO_TICK, INDICANT, COMPL_SYMBOL, STOP); reduce (q, NO_NOTE, NO_TICK, INDICANT, BOOL_SYMBOL, STOP); reduce (q, NO_NOTE, NO_TICK, INDICANT, CHAR_SYMBOL, STOP); @@ -801,8 +800,7 @@ reduce_declarers (NODE_T *p, enum a68_attribute expect) a = ATTRIBUTE (SUB_NEXT (q)); if (a == INT_SYMBOL || a == REAL_SYMBOL || a == BITS_SYMBOL - || a == BYTES_SYMBOL || a == COMPLEX_SYMBOL - || a == COMPL_SYMBOL) + || a == BYTES_SYMBOL || a == COMPL_SYMBOL) { reduce (q, NO_NOTE, NO_TICK, DECLARER, LONGETY, INDICANT, STOP); } @@ -826,14 +824,14 @@ reduce_declarers (NODE_T *p, enum a68_attribute expect) { a = ATTRIBUTE (SUB_NEXT (q)); if (a == INT_SYMBOL || a == REAL_SYMBOL || a == BITS_SYMBOL - || a == BYTES_SYMBOL || a == COMPLEX_SYMBOL || a == COMPL_SYMBOL) + || a == BYTES_SYMBOL || a == COMPL_SYMBOL) { reduce (q, NO_NOTE, NO_TICK, DECLARER, SHORTETY, INDICANT, STOP); } else { a68_error (NEXT (q), "appropriate declarer expected"); - reduce (q, NO_NOTE, NO_TICK, DECLARER, LONGETY, INDICANT, STOP); + reduce (q, NO_NOTE, NO_TICK, DECLARER, SHORTETY, INDICANT, STOP); } } } @@ -2416,6 +2414,7 @@ reduce_enquiry_clauses (NODE_T *p) ENQUIRY_CLAUSE, ENQUIRY_CLAUSE, SEMI_SYMBOL, UNIT, STOP); reduce (q, NO_NOTE, &siga, INITIALISER_SERIES, ENQUIRY_CLAUSE, SEMI_SYMBOL, DECLARATION_LIST, STOP); + /* Errors */ reduce (q, strange_separator, &siga, ENQUIRY_CLAUSE, ENQUIRY_CLAUSE, COMMA_SYMBOL, UNIT, STOP); reduce (q, strange_separator, &siga, @@ -2435,6 +2434,7 @@ reduce_enquiry_clauses (NODE_T *p) ENQUIRY_CLAUSE, INITIALISER_SERIES, SEMI_SYMBOL, UNIT, STOP); reduce (q, NO_NOTE, &siga, INITIALISER_SERIES, INITIALISER_SERIES, SEMI_SYMBOL, DECLARATION_LIST, STOP); + /* Errors */ reduce (q, strange_separator, &siga, ENQUIRY_CLAUSE, INITIALISER_SERIES, COMMA_SYMBOL, UNIT, STOP); reduce (q, strange_separator, &siga, diff --git a/gcc/algol68/a68-parser-debug.cc b/gcc/algol68/a68-parser-debug.cc index 28646b3f31ad..a44c48f8912f 100644 --- a/gcc/algol68/a68-parser-debug.cc +++ b/gcc/algol68/a68-parser-debug.cc @@ -36,7 +36,8 @@ static void a68_dump_parse_tree_1 (NODE_T *p, const text_art::dump_widget_info &dwi, - text_art::tree_widget &widget, bool tables, bool levels) + text_art::tree_widget &widget, bool tables, bool levels, + bool sprops) { for (; p != NO_NODE; FORWARD (p)) { @@ -63,6 +64,40 @@ a68_dump_parse_tree_1 (NODE_T *p, const text_art::dump_widget_info &dwi, else levelsinfo = xstrdup (""); + char *spropsinfo; + if (sprops && a68_yields_value (p)) + { + const char *kindo, *access; + + switch (KINDO (p)) + { + case KINDO_NIL: kindo = "nil"; break; + case KINDO_CST: kindo = "cst"; break; + case KINDO_IDE: kindo = "ide"; break; + case KINDO_VAR: kindo = "var"; break; + case KINDO_GEN: kindo = "gen"; break; + default: + gcc_unreachable (); + } + + switch (ACCESS (p)) + { + case NO_ACCESS: access = "voided"; break; + case ACCESS_DIR: access = "dir"; break; + case ACCESS_IND: access = "ind"; break; + case ACCESS_VAR: access = "var"; break; + default: + gcc_unreachable (); + } + + spropsinfo = xasprintf ("(%s,%d,%d,%d) %s", + kindo, BNO (p), + DEREFO (p), GENO (p), + access); + } + else + spropsinfo = xstrdup (""); + char mode[BUFFER_SIZE]; mode[0] = '\0'; if (MOID (p) != NO_MOID) @@ -87,7 +122,7 @@ a68_dump_parse_tree_1 (NODE_T *p, const text_art::dump_widget_info &dwi, location_t loc = a68_get_node_location (p); std::unique_ptr cwidget = text_art::tree_widget::from_fmt (dwi, nullptr, - "%s:%d:%d [%d] %s%s%s%s%s", + "%s:%d:%d [%d] %s%s%s%s%s%s", LOCATION_FILE (loc), LOCATION_LINE (loc), LOCATION_COLUMN (loc), @@ -96,18 +131,20 @@ a68_dump_parse_tree_1 (NODE_T *p, const text_art::dump_widget_info &dwi, symbol, mode, tableinfo, - levelsinfo); + levelsinfo, + spropsinfo); free (symbol); free (tableinfo); free (levelsinfo); + free (spropsinfo); - a68_dump_parse_tree_1 (SUB (p), dwi, *cwidget, tables, levels); + a68_dump_parse_tree_1 (SUB (p), dwi, *cwidget, tables, levels, sprops); widget.add_child (std::move (cwidget)); } } void -a68_dump_parse_tree (NODE_T *p, bool tables, bool levels) +a68_dump_parse_tree (NODE_T *p, bool tables, bool levels, bool sprops) { text_art::style_manager sm; text_art::style::id_t default_style_id (sm.get_or_create_id (text_art::style ())); @@ -116,7 +153,7 @@ a68_dump_parse_tree (NODE_T *p, bool tables, bool levels) std::unique_ptr widget = text_art::tree_widget::from_fmt (dwi, nullptr, "Parse Tree"); - a68_dump_parse_tree_1 (p, dwi, *widget, tables, levels); + a68_dump_parse_tree_1 (p, dwi, *widget, tables, levels, sprops); text_art::canvas c (widget->to_canvas (sm)); pretty_printer *const pp = global_dc->get_reference_printer (); diff --git a/gcc/algol68/a68-parser-extract.cc b/gcc/algol68/a68-parser-extract.cc index fc1f318eaaf1..8d026fd569ac 100644 --- a/gcc/algol68/a68-parser-extract.cc +++ b/gcc/algol68/a68-parser-extract.cc @@ -341,9 +341,16 @@ a68_extract_revelation (NODE_T *q, const char *module, const char *filename, NCHAR_IN_LINE (n) = STRING (LINE (INFO (n))); TABLE (n) = TABLE (q); + /* It is necessary to resolve equivalences because the dummy declarer is + not in the parse tree and therefore it is not handled by the call to + computed_derived_modes in a68_make_moid_list. */ + a68_resolve_equivalent (&EXTRACT_MODE (e)); + + MOID (n) = EXTRACT_MODE (e); TAG_T *tag = a68_add_tag (TABLE (q), IDENTIFIER, n, EXTRACT_MODE (e), NORMAL_IDENTIFIER); gcc_assert (tag != NO_TAG); + EXTERN_SYMBOL (tag) = ggc_strdup (EXTRACT_SYMBOL (e)); VARIABLE (tag) = VARIABLE (e); IN_PROC (tag) = IN_PROC (e); diff --git a/gcc/algol68/a68-parser-modes.cc b/gcc/algol68/a68-parser-modes.cc index 9cbf4f962e41..19f8e7f5cbc8 100644 --- a/gcc/algol68/a68-parser-modes.cc +++ b/gcc/algol68/a68-parser-modes.cc @@ -87,8 +87,8 @@ a68_count_pack_members (PACK_T *u) /* Replace a mode by its equivalent mode. */ -static void -resolve_equivalent (MOID_T **m) +void +a68_resolve_equivalent (MOID_T **m) { while ((*m) != NO_MOID && EQUIVALENT ((*m)) != NO_MOID @@ -888,15 +888,15 @@ is_well_formed (MOID_T *def, MOID_T *z, bool yin, bool yang, int video) static void resolve_eq_members (MOID_T *q) { - resolve_equivalent (&SUB (q)); - resolve_equivalent (&DEFLEXED (q)); - resolve_equivalent (&MULTIPLE (q)); - resolve_equivalent (&NAME (q)); - resolve_equivalent (&SLICE (q)); - resolve_equivalent (&TRIM (q)); - resolve_equivalent (&ROWED (q)); + a68_resolve_equivalent (&SUB (q)); + a68_resolve_equivalent (&DEFLEXED (q)); + a68_resolve_equivalent (&MULTIPLE (q)); + a68_resolve_equivalent (&NAME (q)); + a68_resolve_equivalent (&SLICE (q)); + a68_resolve_equivalent (&TRIM (q)); + a68_resolve_equivalent (&ROWED (q)); for (PACK_T *p = PACK (q); p != NO_PACK; FORWARD (p)) - resolve_equivalent (&MOID (p)); + a68_resolve_equivalent (&MOID (p)); } /* Track equivalent tags. */ @@ -907,7 +907,7 @@ resolve_eq_tags (TAG_T *z) for (; z != NO_TAG; FORWARD (z)) { if (MOID (z) != NO_MOID) - resolve_equivalent (&MOID (z)); + a68_resolve_equivalent (&MOID (z)); } } @@ -918,7 +918,7 @@ bind_modes (NODE_T *p) { for (; p != NO_NODE; FORWARD (p)) { - resolve_equivalent (&MOID (p)); + a68_resolve_equivalent (&MOID (p)); if (SUB (p) != NO_NODE && a68_is_new_lexical_level (p)) { @@ -927,7 +927,7 @@ bind_modes (NODE_T *p) { if (NODE (z) != NO_NODE) { - resolve_equivalent (&MOID (NEXT_NEXT (NODE (z)))); + a68_resolve_equivalent (&MOID (NEXT_NEXT (NODE (z)))); MOID (z) = MOID (NEXT_NEXT (NODE (z))); MOID (NODE (z)) = MOID (z); } @@ -1181,11 +1181,11 @@ compute_derived_modes (MODULE_T *mod) resolve_eq_tags (INDICANTS (A68_STANDENV)); resolve_eq_tags (IDENTIFIERS (A68_STANDENV)); resolve_eq_tags (OPERATORS (A68_STANDENV)); - resolve_equivalent (&M_STRING); - resolve_equivalent (&M_COMPLEX); - resolve_equivalent (&M_LONG_COMPLEX); - resolve_equivalent (&M_LONG_LONG_COMPLEX); - resolve_equivalent (&M_SEMA); + a68_resolve_equivalent (&M_STRING); + a68_resolve_equivalent (&M_COMPLEX); + a68_resolve_equivalent (&M_LONG_COMPLEX); + a68_resolve_equivalent (&M_LONG_LONG_COMPLEX); + a68_resolve_equivalent (&M_SEMA); /* UNION members could be resolved. */ absorb_unions (TOP_MOID (mod)); contract_unions (TOP_MOID (mod)); diff --git a/gcc/algol68/a68-parser-moids-equivalence.cc b/gcc/algol68/a68-parser-moids-equivalence.cc index f97dcafc694b..44177f64784d 100644 --- a/gcc/algol68/a68-parser-moids-equivalence.cc +++ b/gcc/algol68/a68-parser-moids-equivalence.cc @@ -121,8 +121,7 @@ are_modes_equivalent (MOID_T * a, MOID_T * b) if (NODE (a) == NO_NODE || NODE (b) == NO_NODE) return false; else - return (NODE (a) == NODE (b) - || strcmp (NSYMBOL (NODE (a)), NSYMBOL (NODE (b))) == 0); + return NODE (a) == NODE (b); } /* Investigate structure. */ diff --git a/gcc/algol68/a68-parser-scanner.cc b/gcc/algol68/a68-parser-scanner.cc index 30c23996dcd8..ce8df69d1119 100644 --- a/gcc/algol68/a68-parser-scanner.cc +++ b/gcc/algol68/a68-parser-scanner.cc @@ -219,8 +219,7 @@ new_source_line (void) MARKER (z)[0] = '\0'; STRING (z) = NO_TEXT; - FILENAME (z) = NO_TEXT; - NUMBER (z) = 0; + LOCATION (z) = UNKNOWN_LOCATION; NEXT (z) = NO_LINE; PREVIOUS (z) = NO_LINE; return z; @@ -229,15 +228,15 @@ new_source_line (void) /* Append a source line to the internal source file. */ static void -append_source_line (const char *str, LINE_T **ref_l, int *line_num, - const char *filename) +append_source_line (const char *str, LINE_T **ref_l, int *line_num) { LINE_T *z = new_source_line (); /* Link line into the chain. */ STRING (z) = xstrdup (str); - FILENAME (z) = ggc_strdup (filename); - NUMBER (z) = (*line_num)++; + LOCATION (z) = linemap_line_start (line_table, + (*line_num)++, + 80 /* max_column_hint */); NEXT (z) = NO_LINE; PREVIOUS (z) = *ref_l; if (TOP_LINE (&A68_JOB) == NO_LINE) @@ -250,14 +249,15 @@ append_source_line (const char *str, LINE_T **ref_l, int *line_num, /* Append environment source lines. */ static void -append_environ (const char *str[], LINE_T **ref_l, int *line_num, const char *name) +append_environ (const char *str[], LINE_T **ref_l, const char *name) { + linemap_add (line_table, LC_ENTER, 1 /* sys_p */, name, 0 /* to_line */); for (int k = 0; str[k] != NO_TEXT; k++) { - int zero_line_num = 0; - (*line_num)++; - append_source_line (str[k], ref_l, &zero_line_num, name); + int line_num = 1; + append_source_line (str[k], ref_l, &line_num); } + linemap_add (line_table, LC_LEAVE, 0, NULL, 0); } /* @@ -285,38 +285,6 @@ unworthy (LINE_T *u, char *v, char ch) a68_scan_error (u, v, A68 (edit_line)); } -/* Concatenate lines that terminate in '\' with next line. */ - -static void -concatenate_lines (LINE_T * top) -{ - LINE_T *q; - /* Work from bottom backwards. */ - for (q = top; q != NO_LINE && NEXT (q) != NO_LINE; FORWARD (q)) - ; - - for (; q != NO_LINE; BACKWARD (q)) - { - char *z = STRING (q); - size_t len = strlen (z); - - if (len >= 2 - && z[len - 2] == BACKSLASH_CHAR - && z[len - 1] == NEWLINE_CHAR - && NEXT (q) != NO_LINE - && STRING (NEXT (q)) != NO_TEXT) - { - z[len - 2] = '\0'; - len += (int) strlen (STRING (NEXT (q))); - z = (char *) xmalloc (len + 1); - a68_bufcpy (z, STRING (q), len + 1); - a68_bufcat (z, STRING (NEXT (q)), len + 1); - STRING (NEXT (q))[0] = '\0'; - STRING (q) = z; - } - } -} - /* Read source file FILENAME and make internal copy. */ static bool @@ -324,7 +292,7 @@ read_source_file (const char *filename) { struct stat statbuf; LINE_T *ref_l = NO_LINE; - int line_num = 0; + int line_num; size_t k; size_t bytes_read; ssize_t l; @@ -360,13 +328,14 @@ read_source_file (const char *filename) /* Prelude. */ append_environ (OPTION_STROPPING (&A68_JOB) == UPPER_STROPPING ? upper_prelude_start : supper_prelude_start, - &ref_l, &line_num, "prelude"); + &ref_l, "prelude"); /* Read the file into a single buffer, so we save on system calls. */ line_num = 1; buffer = (char *) xmalloc (8 + source_file_size); bytes_read = a68_file_read (fileno (f), buffer, source_file_size); gcc_assert (bytes_read == source_file_size); + linemap_add (line_table, LC_ENTER, 0 /* sys_p */, filename, 0 /* to_line */); /* Link all lines into the list. */ k = 0; @@ -389,23 +358,27 @@ read_source_file (const char *filename) A68_PARSER (scan_buf)[l] = '\0'; if (k < source_file_size) k++; - append_source_line (A68_PARSER (scan_buf), &ref_l, &line_num, - FILE_SOURCE_NAME (&A68_JOB)); + append_source_line (A68_PARSER (scan_buf), &ref_l, &line_num); SCAN_ERROR (l != (ssize_t) strlen (A68_PARSER (scan_buf)), NO_LINE, NO_TEXT, "invalid characters in source file"); } + /* Extra line before adding postlude. */ + linemap_line_start (line_table, + line_num, + 80 /* max_column_hint */); + /* Postlude. */ append_environ (OPTION_STROPPING (&A68_JOB) == UPPER_STROPPING ? upper_postlude : supper_postlude, - &ref_l, &line_num, "postlude"); - - /* Concatenate lines that end with \. */ - concatenate_lines (TOP_LINE (&A68_JOB)); + &ref_l, "postlude"); /* Include files. */ include_files (TOP_LINE (&A68_JOB)); + linemap_add (line_table, LC_LEAVE, 0, NULL, 0); + linemap_check_files_exited (line_table); + if (fclose (FILE_SOURCE_FD (&A68_JOB)) != 0) gcc_unreachable (); return ret; @@ -439,6 +412,13 @@ next_char (LINE_T **ref_l, char **ref_s, bool allow_typo, else (*ref_s)++; + /* Skip backslash at the end of lines. */ + if ((*ref_s)[0] == BACKSLASH_CHAR && (*ref_s)[1] == NEWLINE_CHAR) + { + (*ref_s)++; + return next_char (ref_l, ref_s, allow_typo, allow_one_under, found_under); + } + /* Deliver next char. */ ch = (*ref_s)[0]; if ((allow_typo && (ISSPACE (ch) || ch == FORMFEED_CHAR)) @@ -1088,6 +1068,8 @@ include_files (LINE_T *top) SCAN_ERROR ((size_t) bytes_read != fsize, start_l, start_c, "error while reading file"); + linemap_add (line_table, LC_ENTER, 0 /* sys_p */, fn, + 0 /* to_line */); /* Buffer still usable?. */ if (fsize > A68_PARSER (max_scan_buf_length)) { @@ -1105,7 +1087,7 @@ include_files (LINE_T *top) /* If file is empty, insert single empty line. */ A68_PARSER (scan_buf)[0] = NEWLINE_CHAR; A68_PARSER (scan_buf)[1] = NULL_CHAR; - append_source_line (A68_PARSER (scan_buf), &t, &linum, fn); + append_source_line (A68_PARSER (scan_buf), &t, &linum); } else { @@ -1126,14 +1108,14 @@ include_files (LINE_T *top) A68_PARSER (scan_buf)[n] = NULL_CHAR; if (k < fsize) k++; - append_source_line (A68_PARSER (scan_buf), &t, &linum, fn); + append_source_line (A68_PARSER (scan_buf), &t, &linum); } } /* Conclude and go find another include directive, if any. */ + linemap_add (line_table, LC_LEAVE, 0, NULL, 0); NEXT (t) = s; PREVIOUS (s) = t; - concatenate_lines (top); if (fclose (fp) != 0) gcc_unreachable (); make_pass = true; diff --git a/gcc/algol68/a68-parser-scope.cc b/gcc/algol68/a68-parser-scope.cc index bf7ab10361c8..3e1048358c55 100644 --- a/gcc/algol68/a68-parser-scope.cc +++ b/gcc/algol68/a68-parser-scope.cc @@ -20,7 +20,7 @@ . */ /* A static scope checker inspects the source. Note that ALGOL 68 also needs - dynamic scope checking. This phase concludes the parser. */ + dynamic scope checking. */ #include "config.h" #include "system.h" diff --git a/gcc/algol68/a68-parser-sprops.cc b/gcc/algol68/a68-parser-sprops.cc new file mode 100644 index 000000000000..19af22456a89 --- /dev/null +++ b/gcc/algol68/a68-parser-sprops.cc @@ -0,0 +1,1314 @@ +/* Compute some static properties of values. + Copyright (C) 2026 Jose E. Marchesi. + + Written by Jose E. Marchesi. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + . */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "options.h" + +#include "a68.h" + +/* This parser pass computes a set of static properties of certain parse tree + nodes and symtab entries representing source constructs. It is somewhat + inspired on the treatment of static properties described in + + An Optimized Translation Process and Its Application to ALGOL 68 + P. Branquart et al. + + However, the compilation system described in Branquart et al translates + constructs to an IR which is considerably lower in abstraction compared to + GENERIC, and therefore our management of static properties is different. + The underlying ideas, however, are very similar. */ + +/* The origin + ────────── + + The "origin" is a static property of source constructs that yield values. + Its purpose is to record the properties of the original value from which the + construct is derived, as well as the transformations the value has been + submitted to before appearing in the construct. This static property is + composed by several fields described below. + + kindo is the "kind of the origin". + ───── + + It keeps track of the fact that a value is issued from + + ╭─────────╮ + │KINDO_IDE│ an identifier in a VAR_DECL, + ╰─────────╯ + ╭─────────╮ + │KINDO_VAR│ a variable in a VAR_DECL, + ╰─────────╯ + ╭─────────╮ + │KINDO_CST│ a constant in a VAR_DECL with TREE_CONSTANT=1, + ╰─────────╯ + ╭─────────╮ + │KINDO_GEN│ a generator i.e. a malloc or alloca, + ╰─────────╯ + ╭─────────╮ + │KINDO_NIL│ or another construct. + ╰─────────╯ + + This property remains invariant through the static elaboration of a number + of actions such as slices, selection and dereferencings. + + bno is the "block number of the origin". + ─── + + Its meaning for a particular construct is to be interpreted along with its + kindo. + + ● For KINDO_IDE and KINDO_VAR, bno indicates the depth number of the block + where the identifier or the variable is declared. This is not to be + confused with the scope of the value ascribed to the identifier or + stored in the variable. + + ● For KINDO_GEN, when it corresponds to a local generator, bno indicates + the depth number of the block where the generator appears. + + ● For KINDO_CST, and for KINDO_GEN when it corresponds to a heap + generator, bno is always zero. + + ● For KINDO_NIL, bno indicates the depth number of the construct issuing + the value. + + derefo is the "flag dereferencing of the origin". + ────── + + This flag indicates whether a dereferencing action has taken place + starting from the construct in whcih kindo has been set up. This + information allows, in some cases, to statically detect the absence of + side-effects, and subsequently to avoid some copies of values. + + geno is the "flag local generator of the origin". + ──── + + This flag indicates whether a local generator is involved in the + construction of this value. + + diago contains the "diagnostics of the origin". + ───── + + This property contains location information of the construct originating + the value. It is useful in order to emit good diagnostic messages in + dynamic checks pointing to the source program construct giving rise to the + value involved in the dynamic check. */ + +/* The access + ────────── + + In the "low" pass parse tree nodes denoting units will be lowered to GCC + GENERIC trees. These trees compute the values yielded by the units. For + example, a DENOTATION node for an integral value may be lowered to an + INTEGER_CST tree, a FORMULA node to a PLUS_EXPR tree, an applied IDENTIFIER + to a VAR_DECL, and a DEREFERENCING node to an INDIRECT_REF tree. + + In principle, it would be expected for the resulting trees to directly + compute the value denoted by the parse nodes originating them. However, for + reasons of efficiency, this is not always the case. + + Parse nodes lowering to trees that directly compute the value yielded by the + unit are said to have "direct access". Examples: + + ● Consider a denotation "10". The parser builds a parse node DENOTATION + with the value 10 for it, and the "low" pass lowers that parse node into a + GENERIC tree consisting in a single INTEGER_CST tree node, with value 10. + In this case, the tree indeed computes the value yielded by the DENOTATION + node. + + ● An applied IDENTIFIER "maxint" with mode int that has been declared via an + identity declaration, with some integral value ascribed to it. The "low" + pass lowers it into a VAR_DECL with TREE_TYPE int. Again, this node has + "direct access", because the VAR_DECL in a GENERIC r-value position + computes the value ascribed to the IDENTIFIER. + + Parse nodes denoting units that yield names, lowering to VAR_DECL trees + whose address is the value yielded by the unit are said to have "variable + access". Examples: + + ● Suppose that another applied IDENTIFIER "count" with mode int has been + declared, this time via a variable declaration. The value ascribed to the + identifier is in this case a name with mode "ref int". Such a name would + generally be lowered to a tree of type *int, i.e. the address of the + variable, but in this case the node will be lowered to a VAR_DECL with + type int instead. This is an optimization whose goal is to avoid + unnecessary indirect addressing. The tree represents the name and can be + moved around as-is, but when it comes to access the actual value of the + name, i.e. the address of the integral value referenced by the name, it + becomes necessary to take the address of the VAR_DECL. + + Parse nodes lowering to trees that need to be indirected in order to compute + the value yielded by the unit are said to have "indirect access". Examples: + + ● Consider what happens when a DEREFERENCING node has a coercend with + "variable access" which is of mode "ref int", or alternatively a coercend + with "direct access" also of mode "ref int". In the first case, the + coercend will be lowered to a VAR_DECL with type int, as an optimization. + In the second case, the coercend will be lowered to some tree with type + *int. It would make sense for the DEREFERENCING node to be of "direct + class" and be lowered to an INDIRECT_REF tree taking as argument the + address of the VAR_DECL in the first case, and just the value of the + VAR_DECL in the second case. However, as an optimization, the + dereferencing of nodes with "direct class" or "variable class" doesn't + require any run-time action (other than perhaps checking for nil) and the + DEREFERENCING node is lowered to the coercend tree without any + modification. Only when the dereferenced value is actually used, + indirection will be performed. + + ● The value yielded by the last unit in a serial clause doesn't need to be + copied into the outer range if the yielded value is accessible in that + range. Instead, the unit gets lowered to a tree computing the address of + the value, and is given indirect access. + + The different access classes are summarized below: + + ╭──────────╮ + │ACCESS_IND│ indirect access. + ╰──────────╯ + ╭──────────╮ + │ACCESS_DIR│ direct access. + ╰──────────╯ + ╭──────────╮ + │ACCESS_VAR│ variable access. + ╰──────────╯ + + + IND DIR VAR + ─── ─── ─── + node mode: int int ref int + tree type: *int int int + + + The purpose of this static property is thus to guide the lowering pass, but + there is certain level of circularity, as the calculation of the access is + also influenced by the behavior of the lowering pass. + + It is important to remember that the access static property only makes sense + for constructs that yield values, i.e. units. Nodes that are not units are + annotated with NO_ACCESS, which denotes no access. */ + +/* Handling of choice constructs + ───────────────────────────── + + Choice constructs include: + + ● Serial clauses with completers. + ● Conditional clauses. + ● Conformity clauses. + ● Case clauses. + + The characteristic of these constructs is that they need to perform + balancing on a set of alternatives, like the values yielded by the then-part + and the else-part of a conditional clause, in order to determine the static + properties of the value yielded by the choice construct. + + Given a choice construct involving sub-values V1, V2, .. Vn, with their + respective "a priori" static properties, the "a posteriori" static + properties of the resulting value Vr are derived as follows: + + ● The mode of Vr (which is a static property, albeit not handled here) is + determined from the balancing of the modes of V1, V2, ... Vn. This has + already been done by the parser at this stage and the parse tree nodes are + annotated with the "a posteriori" mode of the choice construct. Suitable + coercions are also in the parse tree. + + ● If all sub-values have the same "a priori" origin, then that's the origin + of Vr. Otherwise, we act conservatively by setting KINDO (Vr) to + KINDO_NIL, DEREFO to true iff any of the sub-values have DEREFO set, and + GENO to true iff any of the sub-values have GENO set. + + + ● If all sub-values have the same "a priori" access, then that's the access + of Vr. Otherwise, use direct access. + + These rules are implemented in the corresponding handlers for choice + constructs, below. */ + +/* Allocate a new origin and return it. The new origin is of kind NIL, and its + properties are derived from the given parse node P. */ + +static ORIGIN_T * +make_origin (NODE_T *p) +{ + ORIGIN_T *ori = ggc_alloc (); + ori->kindo = KINDO_NIL; + ori->diago = a68_get_node_location (p); + ori->bno = LEX_LEVEL (p); + ori->derefo = false; + ori->geno = false; + return ori; +} + +/* Allocate a copy of ORI and return it. */ + +static ORIGIN_T * +dup_origin (ORIGIN_T *ori) +{ + ORIGIN_T *res = ggc_alloc (); + *res = *ori; + return res; +} + +/* Determine whether ORI1 and ORI2 reflect the same origin. */ + +static bool +origin_equal_p (ORIGIN_T *ori1, ORIGIN_T *ori2) +{ + return (ori1 != NO_ORIGIN + && ori2 != NO_ORIGIN + && (ori1 == ori2 + || (ori1->kindo == ori2->kindo + && ori1->derefo == ori2->derefo + && ori1->geno == ori2->geno + && ori1->diago == ori2->diago))); +} + +/* Denotations + ─────────── + + Denotations of any mode introduce their own constant origin, and always have + direct access. */ + +static void +sprops_for_denotation (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + KINDO (p) = KINDO_CST; + ACCESS (p) = ACCESS_DIR; +} + +/* Widening coercion + ───────────────── + + Widening of integral and real values result into direct real and complex + values. The widening of bits and bytes result into direct multiple values. + This is a kernel invariant operation, so the origin stays unchanged. */ + +static void +sprops_for_widening (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (SUB (p)); + ACCESS (p) = ACCESS_DIR; +} + +/* Voiding coercion + ──────────────── + + The origin of the voiding construct is the origin of the voided value. The + resulting voided voided value has acess NIL, denoting the absence of value. + This is a kernel invariant operation, so the origin stays unchanged. */ + +static void +sprops_for_voiding (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (SUB (p)); + ACCESS (p) = ACCESS_NIL; +} + +/* Dereferencing coercion + ────────────────────── + + The origin of the dereferenced value is like the origin of the coercend but + with DEREFO set. We always use an indirect access for the coercee so we + delay actual indirection for when (and if) the dereferenced value actually + gets used. */ + +static void +sprops_for_dereferencing (NODE_T *p) +{ + ORIGIN (p) = dup_origin (ORIGIN (SUB (p))); + DEREFO (p) = true; + ACCESS (p) = ACCESS_IND; +} + +/* Deproceduring coercion + ────────────────────── + + It is not possible to detemine the origin of the value yielded by the + elaboration of the procedure, so we create a new one with KINDO_NIL. The + access of the yielded value is always direct. */ + +static void +sprops_for_deproceduring (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; +} + +/* Proceduring + ─────────── + + Procedured jumps result into a proc value. The origin is new and is of + KINDO_NIL. The access for the resulting procedure is always direct. */ + +static void +sprops_for_proceduring (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; +} + +/* Rowing coercion + ─────────────── + + The origin of the coercee is the origin of the coercend. The access of the + resulting value is always direct: reals, complex or multiples of bools or + chars. This is a kernel invariant operation, so the origin stays + unchanged. */ + +static void +sprops_for_rowing (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (SUB (p)); + ACCESS (p) = ACCESS_DIR; +} + +/* Uniting coercion + ──────────────── + + The origin of the coercee is the origin of the coercend. XXX this is a sort + of multiple choices problem as well. This is a kernel invariant operation, + so the origin stays unchanged. */ + +static void +sprops_for_uniting (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (SUB (p)); + ACCESS (p) = ACCESS_DIR; /* XXX */ +} + +/* Loop clauses + ──────────── + + The loop clause effectively acts like voiding, so it has its own origin. We + use NIL access, which denotes the absence of value. */ + +static void +sprops_for_loop_clause (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_NIL; +} + +/* Enclosed clauses + ──────────────── + + The origin and access of the value of an enclosed clause is the origin and + access of the value of its enclosed clause :-O */ + +static void +sprops_for_enclosed_clause (NODE_T *p) +{ + NODE_T *enclosed_clause = SUB (p); + ORIGIN (p) = ORIGIN (enclosed_clause); + ACCESS (p) = ACCESS (enclosed_clause); +} + +/* Access clauses + ────────────── + + The origin/access of the access clause is the origin/access of the + controlled clause. */ + +static void +sprops_for_access_clause (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (NEXT_SUB (p)); +} + +/* Enquiry clauses + ─────────────── + + The origin of the enquiry clause is the origin of the unit yielded by the + underlying serial clause, which is assured to not have choices. The enquiry + clause always yields a boolean value, which much have direct access. */ + +static void +sprops_for_enquiry_clause (NODE_T *p) +{ + if (IS (SUB (p), UNIT)) + ORIGIN (p) = ORIGIN (SUB (p)); + else if (IS (SUB (p), ENQUIRY_CLAUSE) || IS (SUB (p), INITIALISER_SERIES)) + ORIGIN (p) = ORIGIN (NEXT (NEXT_SUB (p))); + else + gcc_unreachable (); + ACCESS (p) = ACCESS_DIR; +} + +/* Serial clauses + ────────────── + + Serial clauses that have completers are choice constructs, in the sense they + yield one of several units determined at run-time, and therefore it becomes + necessary to do some "balancing" at compile-time. See the comment "Handling + of choice constructs" above for a description of the strategy we follow for + the "origin" and "access" static properties in such constructs. */ + +static void +sprops_for_serial_clause (NODE_T *p) +{ + NODE_T *last_unit = NO_NODE, *completer = NO_NODE; + + if (IS (SUB (p), UNIT)) + last_unit = SUB (p); + else if (IS (SUB (p), LABELED_UNIT)) + last_unit = NEXT_SUB (SUB (p)); + else + { + gcc_assert (IS (SUB (p), SERIAL_CLAUSE) || IS (SUB (p), INITIALISER_SERIES)); + + if (IS (NEXT_SUB (p), EXIT_SYMBOL)) + completer = SUB (p); + + NODE_T *q = NEXT (NEXT_SUB (p)); + if (IS (q, UNIT)) + last_unit = q; + else + { + gcc_assert (IS (q, LABELED_UNIT)); + last_unit = NEXT_SUB (q); + } + } + + gcc_assert (last_unit != NO_NODE); + gcc_assert (ORIGIN (last_unit) != NO_ORIGIN); + + if (completer == NO_NODE) + { + ORIGIN (p) = ORIGIN (last_unit); + ACCESS (p) = ACCESS (last_unit); + } + else + { + /* Balance origin. */ + if (origin_equal_p (ORIGIN (completer), ORIGIN (last_unit))) + ORIGIN (p) = ORIGIN (completer); + else + { + bool found_derefo = DEREFO (last_unit) | DEREFO (completer); + bool found_geno = GENO (last_unit) | GENO (completer); + ORIGIN (p) = make_origin (p); + DEREFO (p) = found_derefo; + GENO (p) = found_geno; + } + + /* Balance access. */ + if (ACCESS (completer) == ACCESS (last_unit)) + ACCESS (p) = ACCESS (completer); + else + ACCESS (p) = ACCESS_DIR; + } +} + +/* Parallel clauses + ──────────────── + + A parallel clause yields void, thus we create a fresh origin with KINDO_NIL. + The access is NIL. */ + +static void +sprops_for_parallel_clause (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_NIL; +} + +/* Closed clauses + ────────────── + + The origin/access of a closed clause is the origin/access of its contained + serial clause. */ + +static void +sprops_for_closed_clause (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (NEXT_SUB (p)); +} + +/* Conditional clauses + ─────────────────── + + The if-part and else-part of the conditional clause makes it a choice + construct in terms of static properties propagation. See "Handling of + choice constructs" above. */ + +static void +sprops_for_conditional_clause (NODE_T *p) +{ + NODE_T *then_part = NO_NODE, *else_part = NO_NODE; + + /* IF or ELIF part,SUB is an enquiry clause. */ + NODE_T *s = SUB (p); + + /* THEN part, SUB is a serial clause. */ + FORWARD (s); + then_part = NEXT_SUB (s); + + /* ELSE part. */ + FORWARD (s); + if (IS (s, CHOICE) || IS (s, ELSE_PART)) + else_part = NEXT (NEXT_SUB (s)); + else if (IS (s, CLOSE_SYMBOL) || IS (s, FI_SYMBOL)) + ; + else + { + /* ELIF part. Recurse. */ + sprops_for_conditional_clause (s); + else_part = s; + } + + if (else_part == NO_NODE) + { + ORIGIN (p) = ORIGIN (then_part); + ACCESS (p) = ACCESS (then_part); + } + else + { + /* Balance origin. */ + if (origin_equal_p (ORIGIN (then_part), ORIGIN (else_part))) + ORIGIN (p) = ORIGIN (else_part); + else + { + bool found_derefo = DEREFO (then_part) | DEREFO (else_part); + bool found_geno = GENO (then_part) | GENO (else_part); + + ORIGIN (p) = make_origin (p); + DEREFO (p) = found_derefo; + GENO (p) = found_geno; + } + + /* Balance access. */ + if (ACCESS (then_part) == ACCESS (else_part)) + ACCESS (p) = ACCESS (else_part); + else + ACCESS (p) = ACCESS_DIR; + } +} + +/* Case clauses + ──────────── + + The existence of several alterantives in a case clause makes it a choice + construct in terms of static properties propagation. See "Handling of + choice constructs" above. */ + +static void +sprops_for_case_unit (NODE_T *p, + bool found_mismatch, + ORIGIN_T **postulated_origin, + bool *found_derefo, bool *found_geno, + ACCESS_T *postulated_access) +{ + for (; p != NO_NODE; FORWARD (p)) + { + if (IS (p, UNIT)) + { + *found_derefo |= DEREFO (p); + *found_geno |= GENO (p); + + if (*postulated_origin == NO_ORIGIN && !found_mismatch) + *postulated_origin = ORIGIN (p); + else if (!origin_equal_p (ORIGIN (p), *postulated_origin)) + { + *postulated_origin = NO_ORIGIN; + found_mismatch = true; + } + } + else + sprops_for_case_unit (SUB (p), + found_mismatch, + postulated_origin, + found_derefo, found_geno, + postulated_access); + } +} + +static void +sprops_for_case_clause (NODE_T *p) +{ + NODE_T *out_part = NO_NODE; + + /* CASE or OUSE. */ + NODE_T *s = SUB (p); + + /* IN. */ + NODE_T *in_parts = FORWARD (s); + + /* OUT. */ + FORWARD (s); + if (IS (s, CHOICE) || IS (s, OUT_PART)) + out_part = NEXT (NEXT_SUB (s)); + else if (IS (s, CLOSE_SYMBOL) || IS (s, ESAC_SYMBOL)) + ; + else + { + /* Recurse. */ + sprops_for_case_clause (s); + out_part = s; + } + + /* We start by postulating the properties of the out-part, if it exists, then + go through all the in-parts. */ + + ORIGIN_T *postulated_origin = NO_ORIGIN; + ACCESS_T postulated_access = NO_ACCESS; + + bool found_derefo = false, found_geno = false; + + if (out_part != NO_NODE) + postulated_origin = ORIGIN (out_part); + + sprops_for_case_unit (in_parts, false, + &postulated_origin, + &found_derefo, &found_geno, + &postulated_access); + + /* Balance origin. */ + if (postulated_origin != NO_ORIGIN) + ORIGIN (p) = postulated_origin; + else + { + ORIGIN (p) = make_origin (p); + DEREFO (p) = found_derefo; + GENO (p) = found_geno; + } + + /* Balance access. */ + if (postulated_access != NO_ACCESS) + ACCESS (p) = postulated_access; + else + ACCESS (p) = ACCESS_DIR; + +} + +/* Collateral clauses + ────────────────── + + We distinguish between two cases when handling the static properties of + collateral clauses: + + ● VOID-collateral-clauses yield void, and therefore they have origin of kind + NIL and access NIL. + + ● Row- and struct-displays yield a multiple value, with origin constant and + direct access. */ + +static void +sprops_for_collateral_clause (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + + if (MOID (p) == M_VOID) + { + KINDO (p) = KINDO_NIL; + ACCESS (p) = ACCESS_NIL; + } + else + { + KINDO (p) = KINDO_CST; + ACCESS (p) = ACCESS_DIR; + } +} + +/* Conformity clauses + ────────────────── + + The existence of several alterantives in a conformity clause makes it a + choice construct in terms of static properties propagation. See "Handling + of choice constructs" above. */ + +static void +sprops_for_unite_case_unit (NODE_T *p, + bool found_mismatch, + ORIGIN_T **postulated_origin, + bool *found_derefo, bool *found_geno, + ACCESS_T *postulated_access) +{ + for (; p != NO_NODE; FORWARD (p)) + { + if (IS (p, SPECIFIER)) + { + NODE_T *spec_unit = NEXT_NEXT (p); + + *found_derefo |= DEREFO (spec_unit); + *found_geno |= GENO (spec_unit); + + if (*postulated_origin == NO_ORIGIN && !found_mismatch) + *postulated_origin = ORIGIN (spec_unit); + else if (!origin_equal_p (ORIGIN (spec_unit), *postulated_origin)) + { + *postulated_origin = NO_ORIGIN; + found_mismatch = true; + } + + FORWARD (p); /* Skip specifier. */ + FORWARD (p); /* Skip unit. */ + /* The unit is skipped in the for loop post-action. */ + } + else + sprops_for_unite_case_unit (SUB (p), + found_mismatch, + postulated_origin, + found_derefo, found_geno, + postulated_access); + } +} + +static void +sprops_for_conformity_clause (NODE_T *p) +{ + NODE_T *out_part = NO_NODE; + + /* CASE or OUSE. */ + NODE_T *s = SUB (p); + + /* IN. */ + NODE_T *in_parts = FORWARD (s); + + /* OUT. */ + FORWARD (s); + if (IS (s, CHOICE) || IS (s, OUT_PART)) + out_part = NEXT (NEXT_SUB (s)); + else if (IS (s, CLOSE_SYMBOL) || IS (s, ESAC_SYMBOL)) + ; + else + { + /* Recurse. */ + sprops_for_conformity_clause (s); + out_part = s; + } + + /* We start by postulating the properties of the out-part, if it exists, then + go through all the in-parts. */ + + ORIGIN_T *postulated_origin = NO_ORIGIN; + ACCESS_T postulated_access = NO_ACCESS; + + bool found_derefo = false, found_geno = false; + + if (out_part != NO_NODE) + postulated_origin = ORIGIN (out_part); + + sprops_for_unite_case_unit (in_parts, false, + &postulated_origin, + &found_derefo, &found_geno, + &postulated_access); + + /* Balance origin. */ + if (postulated_origin != NO_ORIGIN) + ORIGIN (p) = postulated_origin; + else + { + ORIGIN (p) = make_origin (p); + DEREFO (p) = found_derefo; + GENO (p) = found_geno; + } + + /* Balance access. */ + if (postulated_access != NO_ACCESS) + ACCESS (p) = postulated_access; + else + ACCESS (p) = ACCESS_DIR; +} + +/* Identity relations + ────────────────── + + The identity relation yields a new boolean value with a fresh origin. Its + access is always direct. */ + +static void +sprops_for_identity_relation (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; +} + +/* Assignations + ──────────── + + If according to previsions the assignation is immediately dereferenced, the + dereferencing is combined with the assignation by the lowerer, and we use + the static properties of the source instaed of those of the destination. */ + +static void +sprops_for_assignation (NODE_T *p) +{ + NODE_T *destination = SUB (p); + ORIGIN (p) = ORIGIN (destination); + /* XXX implement prevision. */ + ACCESS (p) = ACCESS_DIR; +} + +/* Slices + ────── + + The origin of a slice is the origin of the primary being sliced. The access + is alwyas direct. This is a kernel invariant operation, so the origin stays + unchanged. */ + +static void +sprops_for_slice (NODE_T *p) +{ + NODE_T *primary = SUB (p); + ORIGIN (p) = ORIGIN (primary); + ACCESS (p) = ACCESS_DIR; +} + +/* Selections + ────────── + + The origin of a selection is the origin of the secondary being selected. + The access is always direct. This is a kernel invariant operation, so the + origin stays unchanged. */ + +static void +sprops_for_selection (NODE_T *p) +{ + NODE_T *secondary; + + if (IS (SUB (p), SELECTOR)) + secondary = NEXT_SUB (p); + else + { + gcc_assert (IS (SUB (p), SECONDARY)); + secondary = SUB (p); + } + ORIGIN (p) = ORIGIN (secondary); + ACCESS (p) = ACCESS_DIR; +} + +/* Logical functions + ───────────────── + + The logical function constructs (or_function, and_function) introduce a new + origin, which is of class KINDO_NIL. The value yielded by these constructs + is a boolean and its access is always direct. */ + +static void +sprops_for_logical_function (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; +} + +/* Casts + ───── + + Both origin and access of the coercee are the same origin and access o the + coercend in the strong context introduced by the cast. This is a kernel + invariant operation, so the origin stays unchanged. */ + +static void +sprops_for_cast (NODE_T *p) +{ + NODE_T *coercend = NEXT_SUB (p); + ORIGIN (p) = ORIGIN (coercend); + ACCESS (p) = ACCESS (coercend); +} + +/* Calls + ───── + + The value yielded by a call has a fresh origin of class NIL. The access is + always direct. */ + +static void +sprops_for_call (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; +} + +/* Generators + ────────── + + Generators introduce a fresh origin of class GEN, and appropriate + attributes. The access is always IND. */ + +static void +sprops_for_generator (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + KINDO (p) = KINDO_GEN; + + if (IS (SUB (p), LOC_SYMBOL)) + { + BNO (p) = LEX_LEVEL (p); + GENO (p) = true; + } + else + { + BNO (p) = 0; + GENO (p) = false; + } +} + +/* Monadic formulas + ──────────────── + + The value yielded by a monadic formula has the same origin than the single + operand. The access is always direct. */ + +static void +sprops_for_monadic_formula (NODE_T *p) +{ + ORIGIN (p) = ORIGIN (NEXT (SUB (p))); + ACCESS (p) = ACCESS_DIR; +} + +/* Dyadic formulas + ─────────────── + + If both operands of the formula have the same origin, then that is the + origin of the value yielded by the formula. Otherwise a fresh origin is + created with class NIL. The value yielded by the formula always have direct + access. */ + +static void +sprops_for_formula (NODE_T *p) +{ + if (IS (SUB (p), MONADIC_FORMULA) && NEXT_SUB (p) == NO_NODE) + ORIGIN (p) = ORIGIN (SUB (p)); + else + { + NODE_T *arg1 = SUB (p); + NODE_T *arg2 = NEXT (NEXT (SUB (p))); + + if (origin_equal_p (ORIGIN (arg1), ORIGIN (arg2))) + ORIGIN (p) = ORIGIN (arg1); + else + ORIGIN (p) = make_origin (p); + } + ACCESS (p) = ACCESS_DIR; +} + +/* Identifiers + ─────────── + + Both the access and origin of the value yielded by an applied identifier is + obtained from the symtab. If the applied identifier appears before its + declaration, the symtab will not have the properties installed; in that + case, an origin is allocated in the symtab. XXX we need to install a + pointer to the access in the symtab. */ + +static void +sprops_for_applied_identifier (NODE_T *p) +{ + if (ORIGIN (TAX (p)) == NO_ORIGIN) + ORIGIN (TAX (p)) = make_origin (p); + ORIGIN (p) = ORIGIN (TAX (p)); + ACCESS (p) = ACCESS (TAX (p)); +} + +/* Assertions + ────────── + + Assertions introduce a fresh origin of class NIL. The access is also + NIL. */ + +static void +sprops_for_assertion (NODE_T *p) +{ + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_NIL; +} + +/* Fill in the static properties for the symtab entry for the identifier + declared in P, which is a parse node for a declaration. This function shall + handle all node types for which a68_is_declaration returns `true'. */ + +static void +sprops_for_decl (NODE_T *p) +{ + /* Declarations do not yield values themselves, but we set the origin and + access of their defining identifiers in their symtab entries. */ + + ORIGIN (p) = NO_ORIGIN; + ACCESS (p) = NO_ACCESS; + + /* Get the defining identifier. */ + NODE_T *defining_identifier = NO_NODE; + + switch (ATTRIBUTE (p)) + { + case IDENTITY_DECLARATION: + if (IS (SUB (p), IDENTITY_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), PUBLIC_SYMBOL)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), DECLARER)) + defining_identifier = NEXT_SUB (p); + else + gcc_unreachable (); + break; + case PROCEDURE_DECLARATION: + if (IS (SUB (p), PROCEDURE_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), PUBLIC_SYMBOL)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), PROC_SYMBOL)) + defining_identifier = NEXT_SUB (p); + else + gcc_unreachable (); + break; + case BRIEF_OPERATOR_DECLARATION: + if (IS (SUB (p), BRIEF_OPERATOR_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), PUBLIC_SYMBOL)) + defining_identifier = NEXT (NEXT_SUB (p)); + else + defining_identifier = NEXT_SUB (p); + break; + case OPERATOR_DECLARATION: + if (IS (SUB (p), OPERATOR_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else if (IS (SUB (p), PUBLIC_SYMBOL)) + defining_identifier = NEXT (NEXT_SUB (p)); + else + defining_identifier = NEXT_SUB (p); + break; + case VARIABLE_DECLARATION: + if (IS (SUB (p), VARIABLE_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else + { + NODE_T *q = SUB (p); + + if (IS (q, PUBLIC_SYMBOL)) + FORWARD (q); + + if (IS (q, QUALIFIER)) + defining_identifier = NEXT (NEXT (q)); + else if (IS (q, DECLARER)) + defining_identifier = NEXT (q); + else + gcc_unreachable (); + } + break; + case PROCEDURE_VARIABLE_DECLARATION: + if (IS (SUB (p), PROCEDURE_VARIABLE_DECLARATION)) + defining_identifier = NEXT (NEXT_SUB (p)); + else + { + NODE_T *q = SUB (p); + + if (IS (q, PUBLIC_SYMBOL)) + FORWARD (q); + + if (IS (q, PROC_SYMBOL)) + defining_identifier = NEXT (q); + else if (IS (q, QUALIFIER)) + defining_identifier = NEXT (NEXT (q)); + else + gcc_unreachable (); + } + break; + default: + break; + } + + /* Set the static attributes in the symtab for the defining identifier. */ + if (defining_identifier != NO_NODE) + { + switch (ATTRIBUTE (p)) + { + case IDENTITY_DECLARATION: + case PROCEDURE_DECLARATION: + { + TAG_T *tax = TAX (defining_identifier); + if (ORIGIN (tax) == NO_ORIGIN) + ORIGIN (tax) = make_origin (p); + KINDO (tax) = KINDO_IDE; + BNO (tax) = LEX_LEVEL (defining_identifier); + ACCESS (tax) = ACCESS_DIR; + break; + } + case VARIABLE_DECLARATION: + case PROCEDURE_VARIABLE_DECLARATION: + { + TAG_T *tax = TAX (defining_identifier); + if (ORIGIN (tax) == NO_ORIGIN) + ORIGIN (tax) = make_origin (p); + KINDO (tax) = KINDO_VAR; + BNO (tax) = LEX_LEVEL (defining_identifier); + ACCESS (tax) = ACCESS_VAR; + break; + } + case MODE_DECLARATION: + case PRIORITY_DECLARATION: + case BRIEF_OPERATOR_DECLARATION: + case OPERATOR_DECLARATION: + /* These declarations do not ascribe values to identifiers so there + is nothing to do. */ + break; + default: + gcc_unreachable (); + } + } +} + +/* Fill in the static properties for P, which is a parse node for a construct + yielding some value. This function shall handle all node types for which + a68_yields_value returns `true'. */ + +static void +sprops_for_unit (NODE_T *p) +{ + switch (ATTRIBUTE (p)) + { + case UNIT: + case PRIMARY: + case SECONDARY: + case TERTIARY: + ORIGIN (p) = ORIGIN (SUB (p)); + break; + case FORMAL_HOLE: + case JUMP: + case SKIP: + case NIHIL: + case EMPTY_SYMBOL: + case ROUTINE_TEXT: + ORIGIN (p) = make_origin (p); + ACCESS (p) = ACCESS_DIR; + break; + case DENOTATION: + sprops_for_denotation (p); + break; + case IDENTIFIER: + sprops_for_applied_identifier (p); + break; + case MONADIC_FORMULA: + sprops_for_monadic_formula (p); + break; + case FORMULA: + sprops_for_formula (p); + break; + case GENERATOR: + sprops_for_generator (p); + break; + case SELECTION: + sprops_for_selection (p); + break; + case DEREFERENCING: + sprops_for_dereferencing (p); + break; + case DEPROCEDURING: + sprops_for_deproceduring (p); + break; + case PROCEDURING: + sprops_for_proceduring (p); + break; + case SLICE: + sprops_for_slice (p); + break; + case WIDENING: + sprops_for_widening (p); + break; + case UNITING: + sprops_for_uniting (p); + break; + case ROWING: + sprops_for_rowing (p); + break; + case VOIDING: + sprops_for_voiding (p); + break; + case ASSIGNATION: + sprops_for_assignation (p); + break; + case IDENTITY_RELATION: + sprops_for_identity_relation (p); + break; + case ACCESS_CLAUSE: + sprops_for_access_clause (p); + break; + case ENQUIRY_CLAUSE: + sprops_for_enquiry_clause (p); + break; + case LOOP_CLAUSE: + sprops_for_loop_clause (p); + break; + case ENCLOSED_CLAUSE: + sprops_for_enclosed_clause (p); + break; + case SERIAL_CLAUSE: + sprops_for_serial_clause (p); + break; + case CLOSED_CLAUSE: + sprops_for_closed_clause (p); + break; + case PARALLEL_CLAUSE: + sprops_for_parallel_clause (p); + break; + case CONDITIONAL_CLAUSE: + sprops_for_conditional_clause (p); + break; + case CONFORMITY_CLAUSE: + sprops_for_conformity_clause (p); + break; + case CASE_CLAUSE: + sprops_for_case_clause (p); + break; + case COLLATERAL_CLAUSE: + sprops_for_collateral_clause (p); + break; + case CALL: + sprops_for_call (p); + break; + case AND_FUNCTION: + case OR_FUNCTION: + sprops_for_logical_function (p); + break; + case ASSERTION: + sprops_for_assertion (p); + break; + case CAST: + sprops_for_cast (p); + break; + default: + gcc_unreachable (); + } + + /* Sanity check. */ + gcc_assert (ACCESS (p) != NO_ACCESS); + gcc_assert (ORIGIN (p) != NO_ORIGIN); +} + +/* Entry point for the sprops parser pass. */ + +void +a68_sprops (NODE_T *p) +{ + for (; p != NO_NODE; FORWARD (p)) + { + a68_sprops (SUB (p)); + + if (a68_yields_value (p)) + sprops_for_unit (p); + else if (a68_is_declaration (p)) + sprops_for_decl (p); + else + { + ORIGIN (p) = NO_ORIGIN; + ACCESS (p) = NO_ACCESS; + } + } +} diff --git a/gcc/algol68/a68-parser-top-down.cc b/gcc/algol68/a68-parser-top-down.cc index 238749fcb66d..b3f332101b8e 100644 --- a/gcc/algol68/a68-parser-top-down.cc +++ b/gcc/algol68/a68-parser-top-down.cc @@ -64,7 +64,8 @@ const char * a68_phrase_to_text (NODE_T * p, NODE_T ** w) { #define MAX_TERMINALS 8 - int count = 0, line = -1; + int count = 0; + unsigned int line = 0; static BUFFER buffer; for (buffer[0] = '\0'; p != NO_NODE && count < MAX_TERMINALS; FORWARD (p)) diff --git a/gcc/algol68/a68-parser.cc b/gcc/algol68/a68-parser.cc index 4303d5297e85..4c9b17b516e4 100644 --- a/gcc/algol68/a68-parser.cc +++ b/gcc/algol68/a68-parser.cc @@ -298,6 +298,82 @@ a68_is_loop_keyword (NODE_T *p) } } +/* Whether the construct denoted by P is a declaration that introduces some + defining identifier or indicant. */ + +bool +a68_is_declaration (NODE_T *p) +{ + switch (ATTRIBUTE (p)) + { + case IDENTITY_DECLARATION: + case VARIABLE_DECLARATION: + case PROCEDURE_DECLARATION: + case PROCEDURE_VARIABLE_DECLARATION: + case PRIORITY_DECLARATION: + case BRIEF_OPERATOR_DECLARATION: + case OPERATOR_DECLARATION: + case MODE_DECLARATION: + return true; + default: + return false; + } +} + +/* Whether the construct denoted by P yields a value. */ + +bool +a68_yields_value (NODE_T *p) +{ + switch (ATTRIBUTE (p)) + { + case ACCESS_CLAUSE: + case ASSERTION: + case UNIT: + case ROUTINE_TEXT: + case ASSIGNATION: + case TERTIARY: + case MONADIC_FORMULA: + case FORMULA: + case SECONDARY: + case SLICE: + case SELECTION: + case PRIMARY: + case GENERATOR: + case CALL: + case CAST: + case AND_FUNCTION: + case OR_FUNCTION: + case FORMAL_HOLE: + case IDENTITY_RELATION: + case EMPTY_SYMBOL: + case NIHIL: + case SKIP: + case PARALLEL_CLAUSE: + case SERIAL_CLAUSE: + case CLOSED_CLAUSE: + case ENCLOSED_CLAUSE: + case LOOP_CLAUSE: + case CONDITIONAL_CLAUSE: + case CASE_CLAUSE: + case CONFORMITY_CLAUSE: + case COLLATERAL_CLAUSE: + case DENOTATION: + case IDENTIFIER: + case DEREFERENCING: + case DEPROCEDURING: + case PROCEDURING: + case WIDENING: + case UNITING: + case ROWING: + case VOIDING: + case JUMP: + return true; + default: + return false; + } +} + /* Get good attribute. */ enum a68_attribute @@ -345,7 +421,6 @@ a68_dont_mark_here (NODE_T *p) case CLOSE_SYMBOL: case COLON_SYMBOL: case COMMA_SYMBOL: - case COMPLEX_SYMBOL: case COMPL_SYMBOL: case DO_SYMBOL: case ELIF_SYMBOL: @@ -599,6 +674,15 @@ a68_parser (const char *filename) a68_serial_dsa (TOP_NODE (&A68_JOB)); } + /* Static properties. */ + if (ERROR_COUNT (&A68_JOB) == 0) + { + a68_sprops (TOP_NODE (&A68_JOB)); + } + + // XXX + // a68_dump_parse_tree (TOP_NODE (&A68_JOB), false, false, true); + /* Finalise syntax tree. */ if (ERROR_COUNT (&A68_JOB) == 0) { @@ -671,6 +755,8 @@ a68_new_node (void) DYNAMIC_STACK_ALLOCS (z) = false; PUBLICIZED (z) = false; NEGATED (z) = false; + ORIGIN (z) = NO_ORIGIN; + ACCESS (z) = ACCESS_DIR; return z; } @@ -791,9 +877,12 @@ a68_new_tag (void) PUBLICIZED (z) = false; ASCRIBED_ROUTINE_TEXT (z) = false; LOWERER (z) = NO_LOWERER; + ORIGIN (z) = NO_ORIGIN; + ACCESS (z) = ACCESS_DIR; TAX_TREE_DECL (z) = NULL_TREE; MOIF (z) = NO_MOIF; EXTERN_SYMBOL (z) = NO_TEXT; + CTYPE (z) = NULL_TREE; NUMBER (z) = ++A68_PARSER (tag_number); return z; } @@ -1153,18 +1242,16 @@ a68_get_node_location (NODE_T *p) if (line == NO_LINE) return UNKNOWN_LOCATION; - unsigned line_number = NUMBER (line); - unsigned column_number = CHAR_IN_LINE (INFO (p)) - STRING (line) + 1; - const char *filename = FILENAME (line); + const char *start_pos = CHAR_IN_LINE (INFO (p)); + location_t start_loc = a68_get_line_location (line, start_pos); - location_t gcc_location; + if (NSYMBOL (p) == NO_TEXT) + return start_loc; - linemap_add (line_table, LC_ENTER, 0, filename, line_number); - linemap_line_start (line_table, line_number, 0); - gcc_location = linemap_position_for_column (line_table, column_number); - linemap_add (line_table, LC_LEAVE, 0, NULL, 0); + const char *end_pos = start_pos + strlen (NSYMBOL (p)) - 1; + location_t end_loc = a68_get_line_location (line, end_pos); - return gcc_location; + return make_location (start_loc, start_loc, end_loc); } /* Get the location of POS inside LINE as a GCC location. */ @@ -1172,11 +1259,9 @@ a68_get_node_location (NODE_T *p) location_t a68_get_line_location (LINE_T *line, const char *pos) { - location_t loc; - - linemap_add (line_table, LC_ENTER, 0, FILENAME (line), NUMBER (line)); - linemap_line_start (line_table, NUMBER (line), 0); - loc = linemap_position_for_column (line_table, pos - STRING (line) + 1); - linemap_add (line_table, LC_LEAVE, 0, NULL, 0); + unsigned column_number = pos - STRING (line) + 1; + location_t loc = linemap_position_for_loc_and_offset (line_table, + LOCATION(line), + column_number); return loc; } diff --git a/gcc/algol68/a68-pretty-print.h b/gcc/algol68/a68-pretty-print.h index 16dbb415b861..0b78599876f7 100644 --- a/gcc/algol68/a68-pretty-print.h +++ b/gcc/algol68/a68-pretty-print.h @@ -223,14 +223,15 @@ struct a68_line_format_token : public a68_format_token a68_line_format_token (LINE_T *l, NODE_T *n) { gcc_assert (l != NO_LINE); - if (NUMBER (l) == 0) + const char *fname = FILENAME (l); + if (strcmp (fname, "prelude") == 0 || strcmp (fname, "postlude") == 0) m_str = xstrdup ("in standard environment"); - else if (n != NO_NODE && NUMBER (l) == LINE_NUMBER (n)) + else if (n != NO_NODE && LINE_NO (l) == LINE_NUMBER (n)) m_str = xstrdup ("in this line"); else { m_str = (char *) xmalloc (18); - if (snprintf (m_str, 18, "in line %d", NUMBER (l)) < 0) + if (snprintf (m_str, 18, "in line %d", LINE_NO (l)) < 0) gcc_unreachable (); } } diff --git a/gcc/algol68/a68-types.h b/gcc/algol68/a68-types.h index 5bf348890f77..0a3611f8b3e4 100644 --- a/gcc/algol68/a68-types.h +++ b/gcc/algol68/a68-types.h @@ -69,6 +69,28 @@ enum a68_tree_index ATI_MAX }; +enum a68_access +{ + /* Access. See a68-parser-sprops.cc. */ + NO_ACCESS = 0, + ACCESS_NIL, + ACCESS_DIR, + ACCESS_IND, + ACCESS_VAR +}; + +typedef enum a68_access ACCESS_T; + +enum a68_kindo +{ + /* Kind of origin. See a68-parser-sprops.cc. */ + KINDO_NIL = 0, + KINDO_CST, + KINDO_IDE, + KINDO_VAR, + KINDO_GEN +}; + /* * Type definitions. */ @@ -318,52 +340,25 @@ struct GTY(()) OPTIONS_T bool nil_checking; }; -/* The access class static property of a stored value determines how the value - can be reached at run-time. It is used by the lowering pass in order to - minimize copies at run-time. - - CONSTANT is for constant literals. At run-time these literals will either - reside in operand instructions or in space allocated in CONSTAB%. - - DIRIDEN (direct identifier) means that the value is stored on IDST% at some - static address. This is the access class used for values ascribed to - identifiers as long as the block in hich they are declared has not been - left. It is also used for values resulting from actions such as the - selection from a value possessed by an identifier or the dereferencing fo a - name corespodning to a variable. - - VARIDEN (variable identifier) is used for values which are names/variables. - The name is stored on IDST%. The static elaboration of the dereferencing of - a variable with access VARIDEN results in a value with access DIRIDEN, not - requiring any run-time action. Same happens with selections of variables of - access VARIDEN. - - INDIDEN (indirect identifier) is used for values that are stored in a memory - location in IDST%. The static elaboration of a dereferencing applied to a - value of access DIRIDEN. - - DIRWOST (direct working stack) is very much like DIRIDEN, except that the - value is stored in WOST% rather than in IDST%. This access is used for the - result of an action when this result does not preexist in memory and hence - has to be constructed in WOST%. - - INDWOST (indirect working stack) is very similar to INDIDEN. Such an access - can be obtained for example through the static elaboration of the - dereferencing of a name the access of which is DIRWOST. - - NIHIL is used to characterize the absence of value. This is used in the - static elaboration of a jump, a voiding and a call ith a void result. - - Note that in all these classes we assume as run-time the intermediate - language level we are lowering to, i.e. GENERIC. A DIRIDEN value, for - example, can very well stored in a register depending on further compiler - optimizations. */ - -#define ACCESS_NIHIL 0 -#define ACCESS_CONSTANT 1 -#define ACCESS_DIRIDEN 2 -#define ACCESS_INDIDEN 3 -#define ACCESS_DIRWOST 4 +/* An ORIGIN_T is a set of static properties that keep track of the story of + the value represented by an AST node, i.e. the way it has been obtained. + + KINDO is the kind of the origin. + BNO is the block number of the origin. + DEREFO is the flag dereferencing of the origin. + GENO is the flag local generator of the origin. + DIAGO is the location of the origin. */ + +#define NO_ORIGIN ((ORIGIN_T *) 0) + +struct GTY(()) ORIGIN_T +{ + enum a68_kindo kindo; + int bno; + bool derefo; + bool geno; + location_t diago; +}; /* A NODE_T is a node in the A68 Syntax tree produced by the lexer-scanner and later expanded by the Mailloux parser. @@ -424,7 +419,11 @@ struct GTY(()) OPTIONS_T pass. ORIGIN is a static property that describes the history of the entity denoted - by the node. This is only used in nodes denoting values. + by the node. This is only used in nodes denoting constructs that yield a + value, i.e. units. + + ACCESS is a static property that describes how to compute the value yielded + by the node given the GENERIC tree it lowers to. DYNAMIC_STACK_ALLOCS is a flag used in serial clause nodes. It determines whether the elaboration of the phrases in the serial clause may involve @@ -459,6 +458,8 @@ struct GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) NODE_T bool dynamic_stack_allocs; bool publicized; bool negated; + ORIGIN_T *origin; + enum a68_access access; }; #define NO_NODE ((NODE_T *) 0) @@ -537,8 +538,7 @@ struct GTY((chain_next ("%h.next"))) LINE_T { char marker[6]; char * GTY((skip)) string; - const char *filename; - int number; + location_t location; LINE_T *next, *previous; }; #define NO_LINE ((LINE_T *) 0) @@ -569,12 +569,20 @@ struct GTY(()) TABLE_T NODE is the defining identifier associated to the declaration. - SCOPE is the lexical depth of the tag. Zero corresponds to the primal - scope. It is set by the static scope checker. + SCOPE is the lexical depth of the scope of the value ascribed to the tag. + Zero corresponds to the primal scope. Only valid when SCOPE_ASSIGNED is + set. This field is set by the static scope checker. SCOPE_ASSIGNED determines whether a SCOPE has been actually assigned to the - tag. It is set by the static scope checker. The entities which get - assigned scopes are identities of format texts and routine texts. + tag. This field is set by the static scope checker. + + YOUNGEST_ENVIRON is used when NODE is either a ROUTINE_TEXT or a + FORMAT_TEXT, and contains the youngest (higher) lexical level of any object + directly declared in the routine or format body. This is filled in and used + by the scope checker. + + LEVEL is the lexical depth of the declaration in which tag was introduced. + It is set by the symbol table management. PORTABLE determines whether the construction associated with the tag is Algol 68 or some extension. @@ -605,11 +613,6 @@ struct GTY(()) TABLE_T These declarations are optimized in a similar way than variable declarations in order to avoid indirect addressing. - YOUNGEST_ENVIRON is used when NODE is either a ROUTINE_TEXT or a - FORMAT_TEXT, and contains the youngest (higher) lexical level of any object - directly declared in the routine or format body. This is filled in and used - by the scope checker. - TREE_DECL is the GENERIC declaration for the definition of this symbol. This is set and used by the lower pass. For mode indicants, it contains a function that generates a pointer to the given mode, and is used by @@ -621,7 +624,20 @@ struct GTY(()) TABLE_T module declaration. This is only used in entries where MOIF is not NO_MOIF. LOWERER is a lowering routine defined in a68-low-prelude.cc. These are used - in taxes that denote some pre-defined operator. */ + in taxes that denote some pre-defined operator. + + ORIGIN is a static property that describes the history of the value being + ascribed to the identifier. + + ACCESS is a static property that describes how to compute the value yielded + by the identifier given the GENERIC tree it lowers to. + + CTYPE is either NULL_TREE or a GENERIC type. This is currently used for + declarers that are applied indicants, and is the type that is created in + a68_lower_mode_declaration, a variant derived from the actual ctype of the + MOID of the applied indicant. The lowerers for identity declarations, + variable declarations etc must use this type if it exists in the declaration + declarer. */ struct GTY((chain_next ("%h.next"))) TAG_T { @@ -633,9 +649,11 @@ struct GTY((chain_next ("%h.next"))) TAG_T bool ascribed_routine_text, is_recursive, publicized; int priority, heap, scope, youngest_environ, number; STATUS_MASK_T status; - tree tree_decl; + tree tree_decl, ctype; MOIF_T *moif; LOWERER_T lowerer; + ORIGIN_T *origin; + enum a68_access access; TAG_T *next, *body; const char *extern_symbol; }; @@ -912,16 +930,16 @@ struct GTY(()) A68_T * in order to achieve a nice ALGOL-like field OF struct style. */ +#define ACCESS(p) ((p)->access) #define ASM_LABEL(m) ((m)->asm_label) #define BACKWARD(p) (p = PREVIOUS (p)) -#define DEFLEX(p) (DEFLEXED (p) != NO_MOID ? DEFLEXED(p) : (p)) -#define FORWARD(p) ((p) = NEXT (p)) #define A(p) ((p)->a) #define ANNOTATION(p) ((p)->annotation) #define ANONYMOUS(p) ((p)->anonymous) #define ATTRIBUTE(p) ((p)->attribute) #define ASCRIBED_ROUTINE_TEXT(p) ((p)->ascribed_routine_text) #define B(p) ((p)->b) +#define BNO(p) ((p)->origin->bno) #define BODY(p) ((p)->body) #define CAST(p) ((p)->cast) #define CHAR_IN_LINE(p) ((p)->char_in_line) @@ -932,9 +950,11 @@ struct GTY(()) A68_T #define COMMENT_LINE(p) ((p)->comment_line) #define COMMENT_TYPE(p) ((p)->comment_type) #define CTYPE(p) ((p)->ctype) +#define DEFLEX(p) (DEFLEXED (p) != NO_MOID ? DEFLEXED(p) : (p)) #define DEFLEXED(p) ((p)->deflexed_mode) -#define DEREFO(p) ((p).derefo) +#define DEREFO(p) ((p)->origin->derefo) #define DERIVATE(p) ((p)->derivate) +#define DIAGO(p) ((p)->origin->diago) #define DIM(p) ((p)->dim) #define DYNAMIC_STACK_ALLOCS(p) ((p)->dynamic_stack_allocs) #define EQUIVALENT(p) ((p)->equivalent_mode) @@ -949,14 +969,12 @@ struct GTY(()) A68_T #define EXTRACT_VARIABLE(p) ((p)->variable) #define WARNING_COUNT(p) ((p)->warning_count) #define F(p) ((p)->f) -#define FILENAME(p) ((p)->filename) #define FILE_SOURCE_FD(p) ((p)->file_source_fd) #define FILE_SOURCE_NAME(p) ((p)->file_source_name) -#define FLEXO(p) ((p).flexo) -#define FLEXO_KNOWN(p) ((p).flexo_known) +#define FORWARD(p) ((p) = NEXT (p)) #define G(p) ((p)->g) #define GINFO(p) ((p)->genie) -#define GENO(p) ((p).geno) +#define GENO(p) ((p)->origin->geno) #define GET(p) ((p)->get) #define GPARENT(p) (PARENT (GINFO (p))) #define GREEN(p) ((p)->green) @@ -988,6 +1006,7 @@ struct GTY(()) A68_T #define JUMP_STAT(p) ((p)->jump_stat) #define JUMP_TO(p) ((p)->jump_to) #define K(q) ((q)->k) +#define KINDO(p) ((p)->origin->kindo) #define LABELS(p) ((p)->labels) #define LAST(p) ((p)->last) #define LAST_LINE(p) ((p)->last_line) @@ -996,10 +1015,11 @@ struct GTY(()) A68_T #define LEX_LEVEL(p) (LEVEL (TABLE (p))) #define LINBUF(p) ((p)->linbuf) #define LINE(p) ((p)->line) +#define LOCATION(p) ((p)->location) #define LINE_APPLIED(p) ((p)->line_applied) #define LINE_DEFINED(p) ((p)->line_defined) #define LINE_END_MENDED(p) ((p)->line_end_mended) -#define LINE_NUMBER(p) (NUMBER (LINE (INFO (p)))) +#define LINE_NUMBER(p) (LINE_NO (LINE (INFO (p)))) #define LINSIZ(p) ((p)->linsiz) #define LIST(p) ((p)->list) #define ln(x) (log (x)) @@ -1060,6 +1080,7 @@ struct GTY(()) A68_T #define OPTION_LIST(p) (OPTIONS (p).list) #define OPTION_LOCAL(p) (OPTIONS (p).local) #define OPTION_NODEMASK(p) (OPTIONS (p).nodemask) +#define ORIGIN(p) ((p)->origin) #define OUT(p) ((p)->out) #define OUTER(p) ((p)->outer) #define P(q) ((q)->p) diff --git a/gcc/algol68/a68.h b/gcc/algol68/a68.h index 13603061290c..90f5467cf65b 100644 --- a/gcc/algol68/a68.h +++ b/gcc/algol68/a68.h @@ -107,6 +107,30 @@ enum #include "a68-types.h" +/* Location-tracking functions. */ + +/* Get the file name that LINE belongs to. */ + +inline const char * +FILENAME (LINE_T *line) +{ + const line_map_ordinary * ord_map; + ord_map = (const line_map_ordinary *)(linemap_lookup (line_table, + LOCATION (line))); + return LINEMAP_FILE (ord_map); +} + +/* Get the 1-based line number of LINE. */ + +inline unsigned int +LINE_NO (LINE_T *line) +{ + location_t loc = LOCATION (line); + const line_map_ordinary * ord_map; + ord_map = (const line_map_ordinary *)(linemap_lookup (line_table, loc)); + return SOURCE_LINE (ord_map, loc); +} + /* Front-end global state. */ extern GTY(()) A68_T a68_common; @@ -120,7 +144,6 @@ extern GTY(()) A68_T a68_common; #define A68_GLOBAL_TREES A68 (global_trees) #define A68_PARSER(Z) (A68 (parser_state).Z) #define A68_MODULE_DEFINITION_DECLS A68 (module_definition_decls) -#define A68_GLOBAL_CONTEXT A68 (global_context) #define A68_GLOBAL_DECLARATIONS A68 (global_declarations) /* Particular pre-defined modes. */ @@ -316,6 +339,8 @@ char *a68_new_string (const char *t, ...); const char *a68_attribute_name (enum a68_attribute attr); location_t a68_get_node_location (NODE_T *p); location_t a68_get_line_location (LINE_T *line, const char *pos); +bool a68_yields_value (NODE_T *p); +bool a68_is_declaration (NODE_T *p); /* a68-parser-top-down.cc */ @@ -414,8 +439,8 @@ PACK_T *a68_absorb_union_pack (PACK_T * u); void a68_add_mode_to_pack (PACK_T **p, MOID_T *m, const char *text, NODE_T *node); void a68_add_mode_to_pack_end (PACK_T **p, MOID_T *m, const char *text, NODE_T *node); void a68_make_moid_list (MODULE_T *mod); - void a68_renumber_moids (MOID_T *p, int n); +void a68_resolve_equivalent (MOID_T **m); /* a68-moids-to-string.cc */ @@ -499,6 +524,10 @@ void a68_scope_checker (NODE_T *p); void a68_serial_dsa (NODE_T *p); +/* a68-parser-sprops.cc */ + +void a68_sprops (NODE_T *p); + /* a68-parser-pragmat.cc */ void a68_handle_pragmats (NODE_T *p); @@ -718,10 +747,12 @@ void a68_push_serial_clause_range (MOID_T *clause_mode, bool save_restore_stack = false); tree a68_pop_serial_clause_range (void); void a68_add_stmt (tree exp); +void a68_add_global_decl (tree decl); void a68_add_decl (tree decl); void a68_add_decl_expr (tree decl_expr); void a68_add_completer (void); tree a68_range_context (void); +tree a68_global_context (void); tree a68_range_names (void); tree a68_range_stmt_list (void); @@ -1072,7 +1103,8 @@ char *a68_find_archive_export_data (const char *filename, int fd, size_t *size); /* a68-parser-debug.cc */ -void a68_dump_parse_tree (NODE_T *p, bool tables = false, bool levels = false); +void a68_dump_parse_tree (NODE_T *p, bool tables = false, bool levels = false, + bool sprops = false); void a68_dump_modes (MOID_T *m); void a68_dump_moif (MOIF_T *moif); diff --git a/gcc/algol68/ga68.vw b/gcc/algol68/ga68.vw index 2f3ef144da0f..d5fcab775465 100644 --- a/gcc/algol68/ga68.vw +++ b/gcc/algol68/ga68.vw @@ -272,7 +272,7 @@ f) *NEST range : "variables". The former are either a denotation or an identifier of some mode. The second are identifiers of a "reference to" mode. } -{ The rule f introduces a paranotion for all the constructs that +{ The rule {f} introduces a paranotion for all the constructs that introduce new ranges. } 3.1 Closed clauses @@ -539,7 +539,7 @@ i) WHETHER NEST filters EMPTY out of EMPTY{h} : WHETHER true. d) A PUB B } -{ In rule b, the 'invoke TAU's enveloped by 'INKS' represent those +{ In rule {b}, the 'invoke TAU's enveloped by 'INKS' represent those modules which might need to be invoked at any module-call whose applied-module-indication identified a particular defining-module-indication, whereas those enveloped by 'INKSETY' @@ -550,13 +550,13 @@ i) WHETHER NEST filters EMPTY out of EMPTY{h} : WHETHER true. that all modules now invoked will never be invoked again within those descendents. } -{ Rule f ensures the independence of declarations revealed by one +{ Rule {f} ensures the independence of declarations revealed by one revelation; thus MODULE A = DEF PUB REAL x FED, B = DEF PUB REAL x FED; ACCESS A, B (x) - is not produced. However, rule e allows a given declaration to be + is not produced. However, rule {e} allows a given declaration to be revealed by two public accesses of the same module, as in MODULE A = DEF PUB REAL x FED; @@ -634,11 +634,11 @@ e) NEST declaration with DECSETY without DECSETY1{49e} : and also{94f} token, NEST declaration with DECSETY3 without DECSETY1{e}. -{ Rule e determines how a "NEST declaration with DECSETY without +{ Rule {e} determines how a "NEST declaration with DECSETY without DECSETY1" results into two groups of declarations. The declarations in 'DECSETY' are public and syntactically preceded by PUB. The - declarations in 'DECSETY1 are non-public and are not marked by - PUB. } + declarations in 'DECSETY1 are non-public and are not marked by PUB. + } 4.2 Mode declarations @@ -838,12 +838,12 @@ g) WHETHER MOIDS ravels to MOODS{g,46s} : mode if they have the same number of fields with the same tags and their modes deflex. } -{ The hyperrule f) implements a predicate that determines whether two +{ The hyperrule {f} implements a predicate that determines whether two provided sets of moods are incestuous, i.e. whether they contain modes which are firmly related. } -{ The hyperrule g) determines whether a set of moods and - united modes may be ravelled. } +{ The hyperrule {g} determines whether a set of moods and united modes + may be ravelled. } 4.8 Indicators and field selectors @@ -968,11 +968,11 @@ g) *module text : f) POSTLUDE close (f) } -{ Note that the EMPTY (for PROPSETY) in rule f enforces that a module - postlude cannot contain declarations, labels or module accesses. - Only units are allowed. } +{ Note that the EMPTY (for PROPSETY) in rule {f} enforces that a + module postlude cannot contain declarations, labels or module + accesses. Only units are allowed. } -{ Rule b ensures that a unique 'TAU' is associated with each +{ Rule {b} ensures that a unique 'TAU' is associated with each module-text accessible from any given point in the program. This is used to ensure that an invoke ATU' can be identified in the nest of all descendent constructs of any access-clause or module-text which @@ -1391,7 +1391,7 @@ b) widened to{61A} structured with SIZETY real field letter r letter e SIZETY real field letter i letter m mode FORM : MEEK{61C} SIZETY real FORM ; widened to{a} SIZETY real FORM. -c) widened to{61A} row of boolean FORM : MEEK{61C} BIT FORM. +c) widened to{61A} row of boolean FORM : MEEK{61C} BITS FORM. d) widened to{61A} row of character FORM : MEEK{61C} BYTES FORM. { Examples: @@ -1631,6 +1631,12 @@ d) WHETHER (procedure with) shields SAFE to yin yang SAFE{73c} : 8 Denotations +8.0.1 Syntax + +a) MOID NEST denoter{5D,A341i} : + pragment{92a} sequence option, + MOID denotation{810a,811a,812a,813a,814a,815a,82a,b,c,83a,-}. + 8.1 Plain denotations 8.1.0.1 Syntax @@ -1640,7 +1646,7 @@ B) *NUMERAL :: fixed point numeral ; variable point numeral ; floating point numeral. a) SIZE INTREAL denotation{a,80a} : - SIZE symbol{94d}, INTREAL, denotation{a,811a,812a}. + SIZE symbol{94d}, INTREAL denotation{a,811a,812a}. b) *plain denotation : PLAIN denotation{a,811a,812a,813a,814a} ; void denotation{815a}. @@ -1648,6 +1654,10 @@ b) *plain denotation : { Example: a) LONG 0 } +{ Note how rule {a} might lead to situations like `long short integral + denotation' but these will eventually result in a blind alley + in {80a} due to MOID not generating `long short integral'. } + 8.1.1 Integral denotations 8.1.1.1 Syntax @@ -1700,7 +1710,7 @@ j) plusminus{i} : plus symbol{94c} ; mius symbol{94c}. 8.1.3.1 Syntax -a) boolean denotation{80a} : true{94b} symbol ; false{94b} smbol. +a) boolean denotation{80a} : true{94b} symbol ; false{94b} symbol. { Examples: a) TRUE @@ -1754,7 +1764,7 @@ a) structured with row of boolean field long{94d} symbol, structured with row of boolean field LENGTHETY letter aleph mode denotation{a,c}. b) structured with row of boolean field - SHORT SHORTHTETY letter aleph mode denotation{b,80a} : + SHORT SHORTHETY letter aleph mode denotation{b,80a} : short{94d} symbol, structured with row of boolean field SHORTHETY letter aleph mode denotation{b,c}. c) structured wih row of boolean field @@ -1974,12 +1984,12 @@ k) *digit symbol : DIGIT symbol{94b}. packets when taken in conjunction with the particular-program BEGIN NEST "abc" END } -{ In rule a above, 'MODSETY' envelops the 'MOD's defined by al the +{ In rule {a} above, 'MODSETY' envelops the 'MOD's defined by al the definition-module-packets that are being stuffed along with the stuffing-packet. - In rules c and d, 'MODSETY1' need only envelop the 'MOD's for those - modules actually accessed from within that packet. + In rules {c} and {d}, 'MODSETY1' need only envelop the 'MOD's for + those modules actually accessed from within that packet. The semantics related to packets are only defined if, for a collection of packets being stuffed together, all the 'MOD's diff --git a/gcc/asan.cc b/gcc/asan.cc index 7f625fdcfa09..278c414c0dab 100644 --- a/gcc/asan.cc +++ b/gcc/asan.cc @@ -34,7 +34,6 @@ along with GCC; see the file COPYING3. If not see #include "tm_p.h" #include "ssa.h" #include "stringpool.h" -#include "tree-ssanames.h" #include "optabs.h" #include "emit-rtl.h" #include "cgraph.h" @@ -47,7 +46,6 @@ along with GCC; see the file COPYING3. If not see #include "varasm.h" #include "stor-layout.h" #include "tree-iterator.h" -#include "stringpool.h" #include "attribs.h" #include "asan.h" #include "dojump.h" diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 056fd20c4c6d..e31947bfed6d 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see #include "tree.h" #include "memmodel.h" #include "gimple.h" +#include "tree-eh.h" #include "predict.h" #include "tm_p.h" #include "stringpool.h" @@ -62,7 +63,6 @@ along with GCC; see the file COPYING3. If not see #include "langhooks.h" #include "value-prof.h" #include "builtins.h" -#include "stringpool.h" #include "attribs.h" #include "asan.h" #include "internal-fn.h" @@ -1364,10 +1364,10 @@ expand_builtin_prefetch (tree exp) /* Get a MEM rtx for expression EXP which is the address of an operand to be used in a string instruction (cmpstrsi, cpymemsi, ..). LEN is the maximum length of the block of memory that might be accessed or - NULL if unknown. */ + NULL if unknown. STORE_P is true when EXP is the destination. */ rtx -get_memory_rtx (tree exp, tree len) +get_memory_rtx (tree exp, tree len, bool store_p) { tree orig_exp = exp, base; rtx addr, mem; @@ -1401,7 +1401,7 @@ get_memory_rtx (tree exp, tree len) from the original address we got, and build an all-aliasing unknown-sized access to that one. */ if (is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0))) - set_mem_attributes (mem, exp, 0); + set_mem_attributes (mem, exp, 0, store_p); else if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR && (base = get_base_address (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))) @@ -1414,7 +1414,7 @@ get_memory_rtx (tree exp, tree len) size_zero_node, NULL)), exp, build_int_cst (ptr_type_node, 0)); - set_mem_attributes (mem, exp, 0); + set_mem_attributes (mem, exp, 0, store_p); /* Since we stripped parts make sure the offset is unknown and the alignment is computed from the original address. */ clear_mem_offset (mem); @@ -3770,7 +3770,7 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, if (expected_align < dest_align) expected_align = dest_align; - dest_mem = get_memory_rtx (dest, len); + dest_mem = get_memory_rtx (dest, len, true); set_mem_align (dest_mem, dest_align); len_rtx = expand_normal (len); determine_block_size (len, len_rtx, &min_size, &max_size, @@ -3804,7 +3804,7 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, return dest_mem; } - src_mem = get_memory_rtx (src, len); + src_mem = get_memory_rtx (src, len, false); set_mem_align (src_mem, src_align); /* Copy word part most expediently. */ @@ -3873,8 +3873,8 @@ expand_movstr (tree dest, tree src, rtx target, memop_ret retmode) if (!targetm.have_movstr ()) return NULL_RTX; - dest_mem = get_memory_rtx (dest, NULL); - src_mem = get_memory_rtx (src, NULL); + dest_mem = get_memory_rtx (dest, NULL, true); + src_mem = get_memory_rtx (src, NULL, false); if (retmode == RETURN_BEGIN) { target = force_reg (Pmode, XEXP (dest_mem, 0)); @@ -4150,7 +4150,7 @@ expand_builtin_strncpy (tree exp, rtx target) dest_align, false)) return NULL_RTX; - dest_mem = get_memory_rtx (dest, len); + dest_mem = get_memory_rtx (dest, len, true); store_by_pieces (dest_mem, tree_to_uhwi (len), builtin_strncpy_read_str, const_cast (p), dest_align, false, @@ -4709,7 +4709,7 @@ expand_builtin_memset_args (tree dest, tree val, tree len, len_rtx = expand_normal (len); determine_block_size (len, len_rtx, &min_size, &max_size, &probable_max_size); - dest_mem = get_memory_rtx (dest, len); + dest_mem = get_memory_rtx (dest, len, true); val_mode = TYPE_MODE (unsigned_char_type_node); if (TREE_CODE (val) != INTEGER_CST @@ -4893,8 +4893,8 @@ expand_builtin_memcmp (tree exp, rtx target, bool result_eq) if (arg1_align == 0 || arg2_align == 0) return NULL_RTX; - rtx arg1_rtx = get_memory_rtx (arg1, len); - rtx arg2_rtx = get_memory_rtx (arg2, len); + rtx arg1_rtx = get_memory_rtx (arg1, len, false); + rtx arg2_rtx = get_memory_rtx (arg2, len, false); rtx len_rtx = expand_normal (fold_convert_loc (loc, sizetype, len)); /* Set MEM_SIZE as appropriate. */ @@ -4987,8 +4987,8 @@ expand_builtin_strcmp (tree exp, ATTRIBUTE_UNUSED rtx target) arg1 = builtin_save_expr (arg1); arg2 = builtin_save_expr (arg2); - rtx arg1_rtx = get_memory_rtx (arg1, NULL); - rtx arg2_rtx = get_memory_rtx (arg2, NULL); + rtx arg1_rtx = get_memory_rtx (arg1, NULL, false); + rtx arg2_rtx = get_memory_rtx (arg2, NULL, false); /* Try to call cmpstrsi. */ if (cmpstr_icode != CODE_FOR_nothing) @@ -5144,8 +5144,8 @@ expand_builtin_strncmp (tree exp, ATTRIBUTE_UNUSED rtx target, len = fold_convert_loc (loc, sizetype, len); len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len, len3); } - rtx arg1_rtx = get_memory_rtx (arg1, len); - rtx arg2_rtx = get_memory_rtx (arg2, len); + rtx arg1_rtx = get_memory_rtx (arg1, len, false); + rtx arg2_rtx = get_memory_rtx (arg2, len, false); rtx arg3_rtx = expand_normal (len); result = expand_cmpstrn_or_cmpmem (cmpstrn_icode, target, arg1_rtx, arg2_rtx, TREE_TYPE (len), arg3_rtx, @@ -5617,7 +5617,9 @@ expand_builtin_strub_update (tree exp) build_int_cst (TREE_TYPE (wmptr), 0)); rtx wmark = expand_expr (wmtree, NULL_RTX, ptr_mode, EXPAND_MEMORY); - rtx wmarkr = force_reg (ptr_mode, wmark); + rtx wmark_load = shallow_copy_rtx (wmark); + MEM_NOTRAP_P (wmark_load) = !tree_could_trap_p (wmtree); + rtx wmarkr = force_reg (ptr_mode, wmark_load); rtx_code_label *lab = gen_label_rtx (); do_compare_rtx_and_jump (stktop, wmarkr, STACK_TOPS, STACK_UNSIGNED, @@ -5642,7 +5644,9 @@ expand_builtin_strub_update (tree exp) wmtree = fold_build2 (MEM_REF, wmtype, wmptr, build_int_cst (TREE_TYPE (wmptr), 0)); wmark = expand_expr (wmtree, NULL_RTX, ptr_mode, EXPAND_MEMORY); - wmarkr = force_reg (ptr_mode, wmark); + wmark_load = shallow_copy_rtx (wmark); + MEM_NOTRAP_P (wmark_load) = !tree_could_trap_p (wmtree); + wmarkr = force_reg (ptr_mode, wmark_load); do_compare_rtx_and_jump (stktop, wmarkr, STACK_TOPS, STACK_UNSIGNED, ptr_mode, NULL_RTX, lab, NULL, @@ -5677,6 +5681,7 @@ expand_builtin_strub_leave (tree exp) tree wmtree = fold_build2 (MEM_REF, wmtype, wmptr, build_int_cst (TREE_TYPE (wmptr), 0)); rtx wmark = expand_expr (wmtree, NULL_RTX, ptr_mode, EXPAND_MEMORY); + MEM_NOTRAP_P (wmark) = !tree_could_trap_p (wmtree); stktop = force_reg (ptr_mode, wmark); } @@ -5688,6 +5693,7 @@ expand_builtin_strub_leave (tree exp) tree wmtree = fold_build2 (MEM_REF, wmtype, wmptr, build_int_cst (TREE_TYPE (wmptr), 0)); rtx wmark = expand_expr (wmtree, NULL_RTX, ptr_mode, EXPAND_MEMORY); + MEM_NOTRAP_P (wmark) = !tree_could_trap_p (wmtree); rtx wmarkr = force_reg (ptr_mode, wmark); @@ -6943,8 +6949,7 @@ expand_builtin_atomic_fetch_op (machine_mode mode, tree exp, rtx target, { rtx val, mem, ret; enum memmodel model; - tree fndecl; - tree addr; + tree fndecl, addr, oldval; model = get_memmodel (CALL_EXPR_ARG (exp, 2)); @@ -6971,6 +6976,13 @@ expand_builtin_atomic_fetch_op (machine_mode mode, tree exp, rtx target, gcc_assert (TREE_OPERAND (addr, 0) == fndecl); TREE_OPERAND (addr, 0) = builtin_decl_explicit (ext_call); + oldval = CALL_EXPR_ARG (exp, 1); + + if (!ignore && reg_overlap_mentioned_p (mem, val)) + { + val = force_reg (mode, val); + CALL_EXPR_ARG (exp, 1) = make_tree (TREE_TYPE (oldval), val); + } /* If we will emit code after the call, the call cannot be a tail call. If it is emitted as a tail call, a barrier is emitted after it, and @@ -6987,6 +6999,7 @@ expand_builtin_atomic_fetch_op (machine_mode mode, tree exp, rtx target, /* Then issue the arithmetic correction to return the right result. */ if (!ignore) { + CALL_EXPR_ARG (exp, 1) = oldval; if (code == NOT) { ret = expand_simple_binop (mode, AND, ret, val, NULL_RTX, true, @@ -7066,6 +7079,9 @@ expand_ifn_atomic_bit_test_and (gcall *call) if (maybe_expand_insn (icode, 5, ops)) return; + if (reg_overlap_mentioned_p (mem, val)) + val = force_reg (mode, val); + rtx bitval = val; val = expand_simple_binop (mode, ASHIFT, const1_rtx, val, NULL_RTX, true, OPTAB_DIRECT); @@ -7602,7 +7618,8 @@ inline_string_cmp (rtx target, tree var_str, const char *const_str, { HOST_WIDE_INT offset = 0; rtx var_rtx_array - = get_memory_rtx (var_str, build_int_cst (unsigned_type_node,length)); + = get_memory_rtx (var_str, build_int_cst (unsigned_type_node, length), + false); rtx var_rtx = NULL_RTX; rtx const_rtx = NULL_RTX; rtx result = target ? target : gen_reg_rtx (mode); @@ -10012,6 +10029,79 @@ fold_builtin_fpclassify (location_t loc, tree *args, int nargs) arg = args[5]; type = TREE_TYPE (arg); mode = TYPE_MODE (type); + + /* A target defines the classification optabs when FP comparisons are + unsuitable for classification, for instance because they raise + FE_INVALID for a signaling NaN (PR middle-end/66462). Build on the + built-ins in that case rather than on comparisons. */ + if (optab_handler (isnan_optab, mode) != CODE_FOR_nothing + && optab_handler (isinf_optab, mode) != CODE_FOR_nothing + && optab_handler (isnormal_optab, mode) != CODE_FOR_nothing) + { + tree isnan_fn = builtin_decl_explicit (BUILT_IN_ISNAN); + tree isinf_fn = builtin_decl_explicit (BUILT_IN_ISINF); + tree isnormal_fn = builtin_decl_explicit (BUILT_IN_ISNORMAL); + const struct real_format *fmt = REAL_MODE_FORMAT (mode); + tree itype = NULL_TREE; + scalar_int_mode imode; + + /* The remaining zero versus subnormal test must not use a comparison + either. Testing the magnitude of the encoding for zero works + whenever the format is binary, has a matching integer mode and + stores its sign in the high bit of it; that excludes e.g. XFmode, + whose encoding is narrower than its integer mode, and the composite + formats, whose sign is not a single bit that can be shifted out. */ + if (fmt->b == 2 + && int_mode_for_mode (mode).exists (&imode) + && fmt->signbit_rw == fmt->signbit_ro + && fmt->signbit_rw == (int) GET_MODE_PRECISION (imode) - 1) + { + itype = lang_hooks.types.type_for_mode (imode, 1); + if (itype && TYPE_PRECISION (itype) != GET_MODE_PRECISION (imode)) + itype = NULL_TREE; + } + + if (isnan_fn && isinf_fn && isnormal_fn && itype) + { + arg = builtin_save_expr (arg); + + /* Shifting the sign bit out leaves zero iff ARG is +-0. */ + tmp = fold_build1_loc (loc, VIEW_CONVERT_EXPR, itype, arg); + tmp = fold_build2_loc (loc, LSHIFT_EXPR, itype, tmp, + build_int_cst (integer_type_node, 1)); + tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, tmp, + build_int_cst (itype, 0)); + res = fold_build3_loc (loc, COND_EXPR, integer_type_node, + tmp, fp_zero, fp_subnormal); + + tmp = build_call_expr_loc (loc, isnormal_fn, 1, arg); + tmp = fold_build2_loc (loc, NE_EXPR, integer_type_node, tmp, + integer_zero_node); + res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, + fp_normal, res); + + if (tree_expr_maybe_infinite_p (arg)) + { + tmp = build_call_expr_loc (loc, isinf_fn, 1, arg); + tmp = fold_build2_loc (loc, NE_EXPR, integer_type_node, tmp, + integer_zero_node); + res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, + fp_infinite, res); + } + + if (tree_expr_maybe_nan_p (arg)) + { + tmp = build_call_expr_loc (loc, isnan_fn, 1, arg); + tmp = fold_build2_loc (loc, NE_EXPR, integer_type_node, tmp, + integer_zero_node); + res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, + fp_nan, res); + } + + return res; + } + } + arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg)); /* fpclassify(x) -> diff --git a/gcc/builtins.h b/gcc/builtins.h index 9cca88c647cc..97b79908d0dd 100644 --- a/gcc/builtins.h +++ b/gcc/builtins.h @@ -162,7 +162,7 @@ extern char target_percent_s[3]; extern char target_percent_c[3]; extern char target_percent_s_newline[4]; extern bool target_char_cst_p (tree t, char *p); -extern rtx get_memory_rtx (tree exp, tree len); +extern rtx get_memory_rtx (tree exp, tree len, bool store_p); extern internal_fn associated_internal_fn (combined_fn, tree); extern internal_fn associated_internal_fn (tree); diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 59575b2accb5..8a819de39a97 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,26 @@ +2026-09-26 Tobias Burnus + + * c-attribs.cc (c_common_gnu_attributes): Add "omp groupprivate". + +2026-09-24 Jakub Jelinek + + PR c++/126848 + * c-opts.cc (c_common_post_options): For -ftrivial-auto-var-init=zero + or -ftrivial-auto-var-init=pattern in C++26 or later mode set + AUTO_INIT_CXX26 bit in flag_auto_var_init. + +2026-09-24 Josef Melcr + + * c-attribs.cc (handle_callback_only_attribute): Clean up old code. + +2026-09-22 Chung-Lin Tang + + * c-pragma.h (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_LOCAL. + +2026-09-18 Alfie Richards + + * c-attribs.cc (handle_mode_attribute): Use parse_machine_mode. + 2026-09-10 Jakub Jelinek P3726R2 diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index ae5c2743ce6b..1e6e21005d39 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -619,6 +619,8 @@ const struct attribute_spec c_common_gnu_attributes[] = handle_omp_declare_target_attribute, NULL }, { "omp declare target nohost", 0, 0, true, false, false, false, handle_omp_declare_target_attribute, NULL }, + { "omp groupprivate", 0, 0, true, false, false, false, + handle_omp_declare_target_attribute, NULL }, { "non overlapping", 0, 0, true, false, false, false, handle_non_overlapping_attribute, NULL }, { "alloc_align", 1, 1, false, true, true, false, @@ -2429,7 +2431,6 @@ handle_mode_attribute (tree *node, tree name, tree args, warning (OPT_Wattributes, "%qE attribute ignored", name); else { - int j; const char *p = IDENTIFIER_POINTER (ident); int len = strlen (p); machine_mode mode = VOIDmode; @@ -2461,12 +2462,7 @@ handle_mode_attribute (tree *node, tree name, tree args, else if (!strcmp (p, "unwind_word")) mode = targetm.unwind_word_mode (); else - for (j = 0; j < NUM_MACHINE_MODES; j++) - if (!strcmp (p, GET_MODE_NAME (j))) - { - mode = (machine_mode) j; - break; - } + parse_machine_mode (p, &mode); if (mode == VOIDmode) { @@ -4715,10 +4711,6 @@ handle_callback_only_attribute (tree *node, tree name, tree args, DECL_ARGUMENTS returns NULL at this point. */ int callback_fn_idx = TREE_INT_CST_LOW (val); tree decl_type_args = TYPE_ARG_TYPES (decl_type); - tree it; - for (it = decl_type_args; it != NULL_TREE; it = TREE_CHAIN (it)) - if (it == void_list_node) - break; if (callback_fn_idx == CB_UNKNOWN_POS) { @@ -4760,13 +4752,7 @@ handle_callback_only_attribute (tree *node, tree name, tree args, /* Compare the length of the list of argument indices and the real number of parameters the callback takes. */ unsigned cfn_nargs = list_length (TREE_CHAIN (args)); - unsigned type_nargs = list_length (type_args); - for (it = type_args; it != NULL_TREE; it = TREE_CHAIN (it)) - if (it == void_list_node) - { - --type_nargs; - break; - } + unsigned type_nargs = list_length (type_args) - 1; if (cfn_nargs != type_nargs) { warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes, @@ -4777,7 +4763,7 @@ handle_callback_only_attribute (tree *node, tree name, tree args, } unsigned curr = 0; - tree cfn_it; + tree it, cfn_it; /* Validate type compatibility of the arguments passed from caller function to callback. "it" is used to step through the parameters of the caller, "cfn_it" is diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index 0e2d8bdcfdd7..d27cf3fa6d5f 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -925,8 +925,13 @@ c_common_post_options (const char **pfilename) flag_permitted_flt_eval_methods = PERMITTED_FLT_EVAL_METHODS_C11; if (cxx_dialect >= cxx26) - SET_OPTION_IF_UNSET (&global_options, &global_options_set, - flag_auto_var_init, AUTO_INIT_CXX26); + { + SET_OPTION_IF_UNSET (&global_options, &global_options_set, + flag_auto_var_init, AUTO_INIT_CXX26); + if (flag_auto_var_init > AUTO_INIT_UNINITIALIZED) + flag_auto_var_init + = auto_init_type (flag_auto_var_init | AUTO_INIT_CXX26); + } /* The -Wtrivial-auto-var-init warning is useless for C++, where we always add .DEFERRED_INIT calls when some (vacuous) initializers are bypassed diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h index 5d28cb45c669..4d1afe93959d 100644 --- a/gcc/c-family/c-pragma.h +++ b/gcc/c-family/c-pragma.h @@ -141,6 +141,7 @@ enum pragma_omp_clause { PRAGMA_OMP_CLAUSE_LASTPRIVATE, PRAGMA_OMP_CLAUSE_LINEAR, PRAGMA_OMP_CLAUSE_LINK, + PRAGMA_OMP_CLAUSE_LOCAL, PRAGMA_OMP_CLAUSE_MAP, PRAGMA_OMP_CLAUSE_MERGEABLE, PRAGMA_OMP_CLAUSE_NOCONTEXT, diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index b2fabc3fdb23..0eeb1c865b97 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,26 @@ +2026-09-22 Chung-Lin Tang + + * c-parser.cc (c_parser_omp_clause_name): Add "local" case. + (c_parser_omp_all_clauses): Add PRAGMA_OMP_CLAUSE_LOCAL case. + (OMP_DECLARE_TARGET_CLAUSE_MASK): Add PRAGMA_OMP_CLAUSE_LOCAL. + ( c_parser_omp_declare_target): Handle OMP_CLAUSE_LOCAL. + * c-typeck.cc (c_finish_omp_clauses): Handle OMP_CLAUSE_LOCAL. + Emit error if local clause variable appears in map clause. + +2026-09-21 Jakub Jelinek + + * c-decl.cc (names_builtin_p): Return 1 for + RID_BUILTIN_BITREVERSEG and RID_BUILTIN_BSWAPG. + +2026-09-16 Jakub Jelinek + + PR c/127383 + * c-typeck.cc (default_conversion): If orig_expr is different + from exp and exp is a bit-field of bit-precise integer type, call + perform_integral_promotions on orig_exp rather than exp. + (build_c_cast): Wrap in NON_LVALUE_EXPR not just lvalues, but + also non-lvalue bit-fields of bit-precise integer type. + 2026-09-11 Richard Biener * gimple-parser.cc (c_parser_gimple_statement): Parse diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 42d35a87a179..ada5a5043af4 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -11934,6 +11934,8 @@ names_builtin_p (const char *name) switch (C_RID_CODE (id)) { case RID_BUILTIN_ASSOC_BARRIER: + case RID_BUILTIN_BITREVERSEG: + case RID_BUILTIN_BSWAPG: case RID_BUILTIN_CONVERTVECTOR: case RID_BUILTIN_HAS_ATTRIBUTE: case RID_BUILTIN_SHUFFLE: diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 3c7572b17b94..927aff6d5b8e 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -16592,6 +16592,8 @@ c_parser_omp_clause_name (c_parser *parser) result = PRAGMA_OMP_CLAUSE_LINEAR; else if (!strcmp ("link", p)) result = PRAGMA_OMP_CLAUSE_LINK; + else if (!strcmp ("local", p)) + result = PRAGMA_OMP_CLAUSE_LOCAL; break; case 'm': if (!strcmp ("map", p)) @@ -22530,6 +22532,11 @@ c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask, = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LINK, clauses); c_name = "link"; break; + case PRAGMA_OMP_CLAUSE_LOCAL: + clauses + = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LOCAL, clauses); + c_name = "local"; + break; case PRAGMA_OMP_CLAUSE_TO: if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) != 0) { @@ -28877,6 +28884,7 @@ c_maybe_parse_omp_decl (tree decl, tree d) ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ENTER) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LOCAL) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE_TYPE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_INDIRECT)) @@ -28946,6 +28954,11 @@ c_parser_omp_declare_target (c_parser *parser) error_at (OMP_CLAUSE_LOCATION (c), "%qD specified both in declare target % and %qs" " clauses", t, OMP_CLAUSE_ENTER_TO (c) ? "to" : "enter"); + else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LOCAL + || value_member (get_identifier ("local"), TREE_VALUE (at2))) + error_at (OMP_CLAUSE_LOCATION (c), + "%qD specified both in declare target % and " + "% clauses", t); else error_at (OMP_CLAUSE_LOCATION (c), "%qD specified both in declare target % and " @@ -28955,6 +28968,11 @@ c_parser_omp_declare_target (c_parser *parser) if (!at1) { DECL_ATTRIBUTES (t) = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (t)); + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LOCAL) + TREE_VALUE (DECL_ATTRIBUTES (t)) + = tree_cons (NULL_TREE, get_identifier ("local"), + TREE_VALUE (DECL_ATTRIBUTES (t))); + if (TREE_CODE (t) != FUNCTION_DECL && !is_global_var (t)) continue; @@ -28965,11 +28983,32 @@ c_parser_omp_declare_target (c_parser *parser) if (ENABLE_OFFLOADING) { g->have_offload = true; - if (is_a (node)) + if (is_a (node) + && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LOCAL) vec_safe_push (offload_vars, t); } } } + else + { + bool saw_local = value_member (get_identifier ("local"), + TREE_VALUE (at1)); + if (saw_local && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER) + { + error_at (OMP_CLAUSE_LOCATION (c), + "%qD specified both in declare target % and " + "%qs clauses", t, + OMP_CLAUSE_ENTER_TO (c) ? "to" : "enter"); + continue; + } + else if (!saw_local && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LOCAL) + { + error_at (OMP_CLAUSE_LOCATION (c), + "%qD specified both in declare target % and " + "% or % clauses", t); + continue; + } + } if (TREE_CODE (t) != FUNCTION_DECL) continue; if ((device_type & OMP_CLAUSE_DEVICE_TYPE_HOST) != 0) diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index ed234f075ca8..9b01f3daec9b 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -2907,7 +2907,17 @@ default_conversion (tree exp) return convert (promoted_type, exp); if (INTEGRAL_TYPE_P (type)) - return perform_integral_promotions (exp); + { + /* Avoid performing integral promotion of bit-precise integer + type bit-field to its corresponding bit-precise integer if + orig_exp is a cast to it to its underlying type. */ + if (orig_exp != exp + && TREE_CODE (exp) == COMPONENT_REF + && DECL_C_BIT_FIELD (TREE_OPERAND (exp, 1)) + && BITINT_TYPE_P (DECL_BIT_FIELD_TYPE (TREE_OPERAND (exp, 1)))) + return perform_integral_promotions (orig_exp); + return perform_integral_promotions (exp); + } return exp; } @@ -7673,7 +7683,12 @@ build_c_cast (location_t loc, tree type, tree expr) } /* Don't let a cast be an lvalue. */ - if (lvalue_p (value)) + if (lvalue_p (value) + /* Also, don't let a cast be a bit-field of a bit-precise integer type, + otherwise it could be incorrectly subject of integer promotions. */ + || (TREE_CODE (value) == COMPONENT_REF + && DECL_C_BIT_FIELD (TREE_OPERAND (value, 1)) + && BITINT_TYPE_P (DECL_BIT_FIELD_TYPE (TREE_OPERAND (value, 1))))) value = non_lvalue_loc (loc, value); /* Don't allow the results of casting to floating-point or complex @@ -17792,6 +17807,22 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) remove = true; break; } + + tree attr; + if (DECL_P (t) + && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP + && (attr = lookup_attribute ("omp declare target", + DECL_ATTRIBUTES (t))) + && value_member (get_identifier ("local"), + TREE_VALUE (attr))) + { + error_at (OMP_CLAUSE_LOCATION (c), + "device-local variable %qD cannot appear " + "in map clause", t); + remove = true; + break; + } + /* OpenACC attach / detach clauses must be pointers. */ if (c_oacc_check_attachments (c)) { @@ -17986,6 +18017,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) case OMP_CLAUSE_ENTER: case OMP_CLAUSE_LINK: + case OMP_CLAUSE_LOCAL: t = OMP_CLAUSE_DECL (c); const char *cname; cname = omp_clause_code_name[OMP_CLAUSE_CODE (c)]; diff --git a/gcc/caller-save.cc b/gcc/caller-save.cc index 281aa0bb0094..5e1a38e47dbc 100644 --- a/gcc/caller-save.cc +++ b/gcc/caller-save.cc @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "backend.h" +#include "target.h" #include "rtl.h" #include "tree.h" #include "predict.h" diff --git a/gcc/calls.cc b/gcc/calls.cc index e5d67b6c97a5..d4f66bc47f28 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -50,7 +50,6 @@ along with GCC; see the file COPYING3. If not see #include "tree-vrp.h" #include "tree-ssanames.h" #include "intl.h" -#include "stringpool.h" #include "hash-map.h" #include "hash-traits.h" #include "attribs.h" diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index 245ba357b5ef..4bd311b11a34 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -3781,7 +3781,10 @@ expand_asm_stmt (gasm *stmt) if (GET_CODE (op) == CONCAT) op = force_reg (GET_MODE (op), op); else if (MEM_P (op)) - op = validize_mem (op); + { + op = validize_mem (op); + MEM_NOTRAP_P (op) = !tree_could_trap_p (val); + } if (asm_operand_ok (op, constraint, NULL) <= 0) { diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index d397c9ae4cc0..7a7278ace5ac 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -205,7 +205,6 @@ along with GCC; see the file COPYING3. If not see #include "tree-nested.h" #include "dbgcnt.h" #include "lto-section-names.h" -#include "stringpool.h" #include "attribs.h" #include "ipa-inline.h" #include "omp-offload.h" diff --git a/gcc/cobol/ChangeLog b/gcc/cobol/ChangeLog index 118706264d31..39a0820bc3dc 100644 --- a/gcc/cobol/ChangeLog +++ b/gcc/cobol/ChangeLog @@ -1,3 +1,330 @@ +2026-09-28 James K. Lowden + + * cbldiag.h (current_call_convention): Whitespace. + (struct cbl_loc_t): Same. + (enum cbl_diag_id_t): Define MfValueClause, and sort. + * cobol1.cc (cobol_warning_suppress): Whitespace. + (cobol_langhook_handle_option): Handle new option. + * gcobol.1: Document new option. + * lang-specs.h: Accept new option. + * lang.opt: Define new option. + * messages.cc: Add new option to dialects. + * picture.cc: Remove structures that no longer support picture validation. + * symbols.cc (cbl_field_t::encode): Use new option. + +2026-09-28 James K. Lowden + + * cdf.y: Synchronize token values. + * parse.y: Remove alphanumeric-edited and numeric-edited nonterminals. + * picture.cc (picsym_settable): Allow only numeric with 'S' in PICTURE. + * scan.l: Remove lexing for alphanumeric-edited and numeric-edited. + * token_names.h: Regenerate. + +2026-09-28 Xavier Del Campo Romero + + * gcobc: Add -export-dynamic. + +2026-09-28 Xavier Del Campo Romero + + * gcobc: Fix -v command-line option. + +2026-09-28 Xavier Del Campo Romero + + * gcobc: Fix --various command-line options. + +2026-09-28 Xavier Del Campo Romero + + * gcobc: Add stored-char-length.cpy via -include. + +2026-09-28 Xavier Del Campo Romero + + * lexio.cc (is_p): Rename function, support 'F'. + (is_pf): Likewise. + (is_program_id): Support FUNCTION-ID. + (valid_sequence_area): Likewise. + +2026-09-28 Robert Dubner + James K. Lowden + + * compare.cc (numeric_alpha_compare): Numeric-edited handling. + * genapi.cc (parser_setop): Likewise. + * genapi.h (parser_setop): Likewise. + * parse.y: Likewise. + * picture.cc (class picture_t): Validate PICTURE. + (is_valid_picture): Likewise. + (process_file): Likewise. + (main): Formatting + * scan_ante.h (level_needed): Likewise. + (class enter_leave_t): Likewise. + (trim_location): Likewise. + (binary_integer_usage): Likewise. + (level_of): Likewise. + (ndigit): Likewise. + (symbol_exists): Likewise. + (typed_name): Likewise. + (yyunput): Likewise. + (unquote): Likewise. + * symbols.cc (symbols_update): Likewise. + (struct symbol_elem_t): Likewise. + (symbol_file): Likewise. + (expand_picture): Numeric-edited handling. + (expand_expanded): Likewise. + (cbl_file_t::filename_of): Formatting. + +2026-09-27 James K. Lowden + + * cbldiag.h (struct cbl_loc_t): Add operators to increment first_column. + (repeat_count): Declare function. + (parse_error_count): Same. + (cobol_location): Remove obsolete comment. + * cdf.y: Update token values. + * parse.y: Introduce PICTURE token. + (keyword_tok): Exclude CDF tokens to prevent false positives. + * parse_ante.h (struct arith_t): Better diagnositic. + (valid_operands): New function. + (parser_move_carefully): Reject invalid operands. + (parser_move2): Whitespace. + (parser_index): Same. + * picture.cc (picture_rules): Revise automaton. + (is_allowed): Add PICTURE constraints. + (seek_paren): Add debug messages. + (is_valid_picture): Rewrote function. + (class picture_t): Capture PICTURE state to report to lexer. + * scan.l: Use is_valid_token for complex pictures. + * scan_ante.h (repeat_count): Use uint32_t, consistent with cbl_field_t. + * semantic_token.h: New file representing lex_picture_t. + * symbols.cc (parse_error_count): Remove declaration. + * symbols.h: Use std::array. + * symfind.cc (struct funcname): Whitespace. + (symbol_match): Use diagnositic quotes. + * token_names.h: Regenerate. + * util.cc (named_constant): Return type of constant. + (repeat_count): Accept location and return uint32_t. + (parse_error_count): Remove declaration. + * util.h (repeat_count): Same. + +2026-09-27 James K. Lowden + + * words/cdf.h: New file. + * words/intrinsic.h: New file. + * words/reserved.h: New file. + +2026-09-27 James K. Lowden + + * picture.cc (symbol_currency): Remove test harness mock-up. + (cbl_internal_error): Same. + (yy_flex_debug): Undefine, per usual. + (seek_paren): Use ISALNUM. + (is_valid_picture): Use repeat_count to resolve size. + * scan_ante.h (repeat_count): Remove declaration. + * util.cc (cbl_prototype_ok): Whitespace. + (cdf_file): Same. + (repeat_count): Same. + (cbl_field_t::encode_numeric): Same. + (cbl_field_t::report_invalid_initial_value): Same. + (literal_subscript_oob): Same. + (valid_move): Same. + (hex2numstr): Same. + (cobol_filename): Same. + (gcc_location_set): Same. + (parse_file): Same. + (iso_cobol_word): Same. + * util.h (repeat_count): Declare function. + +2026-09-27 James K. Lowden + + * Make-lang.in: Add gcc/cobol/picture.cc. + * scan.l: Replace validate_picture with is_valid_picture. + * scan_ante.h: Delete code that was commented out. + * picture.cc: New file. + +2026-09-25 Robert Dubner + + * cobol1.cc (use_static_call): Change name of global function to + set_use_static_call. + (set_use_static_call): Likewise. + (cobol_langhook_handle_option): Use 'value' parameter rather than + 'arg' parameter. + * genapi.cc (use_static_call): Change name. + (set_use_static_call): Likewise. + (create_and_call): Call push/pop_program_state in the correct order. + (literal_call_descriptor_type): Use common structure definition in + both compile-time and run-time code. + (GCOBOL_CALL_FIELD_NAME): Likewise. + (GCOBOL_CALL_FIELD_TYPE): Likewise. + (literal_call_descriptor): Likewise. + (GCOBOL_CALL_FIELD_VALUE): Likewise. + (function_pointer_for_literal_call): Consolidate several calls to + libgcobol. + (parser_call): Likewise. + * lang.opt: Modify definition of -fstatic-call. + +2026-09-23 Robert Dubner + + * gcobol.1: Document the changes. + * genapi.cc (function_pointer_from_name): Honor the + >>CALL-CONVENTION. + (parser_set_pointers): Repair the ZEROES bug. + +2026-09-22 James K. Lowden + + * parse_ante.h (update_prior_invalid_field): Use is_figconst. + (field_add): Always call update_prior_invalid_field. + +2026-09-21 Robert Dubner + + * genapi.cc (actually_create_the_static_field): Use the + new expand_expanded routine. + * symbols.cc (expand_picture): Add space to accommodate the six + additional pre-processing characters. + (expand_expanded): Append compile-time data to the end of numeric- + edited PICTURE strings. + * symbols.h (redefined_token): Formatting. + (class current_tokens_t): Formatting. + (expand_expanded): New declaration. + * util.cc (cbl_field_t::encode_numeric): Use expand_expanded(). + +2026-09-21 James K. Lowden + + * parse.y: Remove unused function. + +2026-09-21 Xavier Del Campo Romero + + * gcobc: Remove stale logic. + +2026-09-19 Robert Dubner + + * parse.y: Comment out unused passby_str() function. + +2026-09-18 Robert Dubner + + * gcobol.1: Documentation for the .so search. + * move.cc: Fix typo. + * parse.y: Data capacity test. + * symbols.cc (expand_picture): Fix off-by-one error; handle corner + case where 'B' is the final character of a numeric-edited PICTURE + string. + * symbols.h: Remove unnecessary test. + +2026-09-18 Xavier Del Campo Romero + + * cobol1.cc (libcompat_copybook): Remove "udf" from the search list. + +2026-09-18 Xavier Del Campo Romero + + * cdf-copy.cc (copybook_elem_t::open_file): Do not error out on failure. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Reapply. + * symbols.h: Likewise. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Replace redundant passby_str with cbl_ffi_crv_str. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Accept arbitrarily-sized PIC X for ANY LENGTH. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Set loc for numeric literals BY VALUE. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Show location for invalid arg in CALL. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Set loc also for numeric literals BY REFERENCE. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Fix undefined loc for CALL args. + +2026-09-18 Xavier Del Campo Romero + + * parse_ante.h (by_content_ok): Use temporary symbol location. + +2026-09-18 Xavier Del Campo Romero + + * cdf-copy.cc (copybook_elem_t::open_file): Use %qs. + +2026-09-18 Xavier Del Campo Romero + + * cdf-copy.cc (copybook_elem_t::open_file): Use fstat(2). + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Fix wrong diagnostic on numeric literals. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Print passing method on error. + +2026-09-18 Xavier Del Campo Romero + + PR cobol/127074 + * scan_post.h (datetime_format_of): Remove trailing pipe. + +2026-09-18 Xavier Del Campo Romero + + * parse.y: Revert. + * symbols.h: Likewise. + +2026-09-17 Robert Dubner + + * genapi.cc (actually_create_the_static_field): Use expanded PICTURE + string. + * lang-specs.h: Updated cc1_options formatting string. + * move.cc (mh_source_is_literalN): Use new numeric-edited routine. + (mh_to_numeric_edited): Likewise. + (move_helper): Likewise. + * parse.y: Formatting. + * symbols.cc (symbol_file): Mollify cppcheck. + (expand_picture): Modified for numeric-editing. + * symbols.h (cbl_dialect_str): Formatting. + (enum dspc_t): Formatting. + (MAXIMUM_ALPHA_LENGTH): Formatting. + (is_elementary): Formatting. + (struct cbl_field_t): Formatting. + (struct cbl_refer_t): Formatting. + (struct parameter_t): Formatting. + (struct cbl_label_t): Formatting. + (class temporaries_t): Formatting. + (struct cbl_locale_t): Formatting. + (hex2numstr): Formatting. + (struct cbl_file_key_t): Formatting. + (struct cbl_file_t): Formatting. + (struct symbol_elem_t): Formatting. + (redefine_field): Formatting. + (is_prototypical): Formatting. + (struct cbl_prog_hier_t): Formatting. + (keyword_alias_add): Formatting. + (class current_tokens_t): Formatting. + (expand_picture): Formatting. + * util.cc (cbl_prototype_ok): Formatting. + (cdf_file): Formatting. + (repeat_count): Formatting. + (cbl_field_t::encode_numeric): Formatting; use new numeric-edited + routine. + (cbl_field_t::report_invalid_initial_value): Formatting. + (valid_move): Formatting. + (cobol_filename): Formatting. + (gcc_location_set): Formatting. + (parse_file): Formatting. + +2026-09-14 James K. Lowden + + * parse.y: Emit diagnostic if symbol_currency_add fails. + * parse_ante.h (update_prior_invalid_field): New function. + (field_add): Use update_prior_invalid_field to validate prior field. + * scan.l: Document currency-symbol domain. + * symbols.cc (symbols_update): Quell redundant diagnostic. + (symbol_currency_symbol_ok): Validate currency symbol. + (symbol_currency_add): Use symbol_currency_symbol_ok. + 2026-09-11 James K. Lowden * parse.y: Add wordop_t to each element. diff --git a/gcc/cobol/Make-lang.in b/gcc/cobol/Make-lang.in index d16947f80515..76505b07af9e 100644 --- a/gcc/cobol/Make-lang.in +++ b/gcc/cobol/Make-lang.in @@ -74,6 +74,7 @@ cobol1_OBJS = \ cobol/lexio.o \ cobol/move.o \ cobol/messages.o \ + cobol/picture.o \ cobol/parse.o \ cobol/scan.o \ cobol/structs.o \ @@ -89,11 +90,10 @@ cobol1_OBJS = \ # libgcobol/valconv.cc that needs to be compiled into both libgcobol # and cobol1. We copy those two source code files from libgcobol to # build/gcc/cobol to avoid the nightmare of one file appearing in more -# than one place. For simplicity, we make those compilations dependent -# on all of the libgcobol/*.h files, which might lead to the occasional -# unnecessary compilation. The impact of that is negligible. +# than one place. For simplicity, we make those compilations +# dependent on all of the libgcobol/*.h files, which might lead to the +# occasional unnecessary compilation. # - cobol/charmaps.cc cobol/valconv.cc: cobol/%.cc: $(LIB_SOURCE)/%.cc cp $^ $@ @@ -239,15 +239,15 @@ cobol/scan.o: cobol/scan.cc \ cobol/parse.cc # As opposed to other objects, gcobc is a shell script and therefore -# is only installed. In other words,no build step is necessary. -# However, some tests rely on gcobc being available from the build tree. +# is only installed. Although no build step is necessary, some tests +# rely on gcobc being available from the build tree. gcobc$(exeext): $(srcdir)/cobol/gcobc cp $< $@ cobol: gcobc$(exeext) -# Update token names if the generator script is installed -# (by a developer) and there's been a change. +# Update token names if the generator script is installed (by a +# developer) and there's been a change. $(srcdir)/cobol/token_names.h: cobol/parse.cc @if [ -f $@.gen ]; then \ $@.gen $(subst .cc,.h,$^) \ diff --git a/gcc/cobol/cbldiag.h b/gcc/cobol/cbldiag.h index ab5f417e2a03..d0b28574819d 100644 --- a/gcc/cobol/cbldiag.h +++ b/gcc/cobol/cbldiag.h @@ -52,7 +52,7 @@ const char * cobol_filename(); #endif /* - * Enumerations do not depend on anything else. + * Enumerations do not depend on anything else. */ enum cbl_gcobol_feature_t { @@ -74,7 +74,7 @@ cbl_call_convention_t current_call_convention(); /* - * CDF state does not require types that would be defined in another file. + * CDF state does not require types that would be defined in another file. */ void cdf_push(); void cdf_push_call_convention(); @@ -108,7 +108,7 @@ struct cbl_loc_t : public cbl_loc_base_t { cbl_loc_t() = default; // cppcheck-suppress uninitDerivedMemberVar cbl_loc_t( int first_line, int first_column, - int last_line, int last_column ) + int last_line, int last_column ) : cbl_loc_base_t { first_line , first_column, last_line, last_column @@ -116,7 +116,7 @@ struct cbl_loc_t : public cbl_loc_base_t { {} // cppcheck-suppress noExplicitConstructor cbl_loc_t( const cbl_loc_base_t& base ) - : cbl_loc_base_t(base) + : cbl_loc_base_t(base) {} explicit cbl_loc_t( int line ) @@ -130,9 +130,26 @@ struct cbl_loc_t : public cbl_loc_base_t { first_column = last_column = 1; return *this; } + cbl_loc_t& operator++() { + if( first_column + 1 < last_column ) first_column++; + return *this; + } + cbl_loc_t operator++(int) { + auto out(*this); + if( first_column + 1 < last_column ) first_column++; + return out; + } + cbl_loc_t& operator+=(int n) { + if( first_column + n < last_column ) first_column += n; + return *this; + } + cbl_loc_t& operator+(int n) const { + auto out(*this); + return out += n; + } // Represent a multi-line location as the first line, so "included from" - // reflects where the COPY statement appears, not where it ends. + // reflects where the COPY statement appears, not where it ends. cbl_loc_t as_first_line() const { cbl_loc_t loc(*this); loc.last_line = first_line; @@ -141,6 +158,11 @@ struct cbl_loc_t : public cbl_loc_base_t { } }; +std::pair repeat_count(const char picture[]); +std::pair repeat_count(const cbl_loc_t& loc, const char picture[]); + +size_t parse_error_count(); + #include /* allow relocate stack */ static_assert(std::is_trivially_copyable::value, @@ -148,23 +170,11 @@ static_assert(std::is_trivially_copyable::value, const cbl_loc_t& cobol_location(); -/* - * Naming Convention: Names end with a letter that indicates - * their kind: - * F fatal, "fatal error: " - * I ice, "internal compiler error: " - * E error, "error: " - * S sorry, "sorry, unimplemented: " - * W warning, "warning: " - * A anachronism, "anachronism: " - * N note, "note: " - * D debug, "debug: " - */ enum cbl_diag_id_t : uint64_t { - CdfNotFoundW, + CdfNotFoundW, CdfParameterW, - - EcUnknownW, + + EcUnknownW, LexIncludeE, LexIncludeOkN, @@ -180,50 +190,51 @@ enum cbl_diag_id_t : uint64_t { IbmContentExpr, IbmEjectE, IbmEqualAssignE, - IbmLengthOf, + IbmLengthOf, IbmProcedurePointer, IbmSectionNegE, IbmSectionRangeE, IbmSectionSegmentW, IbmStopNumber, - IbmVolatileE, + IbmVolatileE, IbmVolatileW, // dialect warning for ignored syntax IsoAssignFile, IsoRedefinesGrow, IsoResume, + MfAnyLength, MfAssignExternal, MfBinaryLongLong, MfCallGiving, MfCallLiteral, - MfDisplayScreen, - MfCdfDollar, + MfCdfDollar, MfComp6, MfCompX, + MfDisplayScreen, MfHexNumeric, - MfLevel_1_Occurs, MfLevel78, - MfAnyLength, - MfMoveIndex, - MfMovePointer, + MfLevel_1_Occurs, + MfMoveIndex, + MfMovePointer, MfRedefinesFirst, MfRedefinesTable, MfReturningNum, MfSetNumeric, MfTrailing, MfUsageTypename, - + MfValueClause, + Par78CdfDefinedW, ParDynamicCall, - ParIconvE, + ParIconvE, ParInfoI, ParLangInfoW, - ParLiteral2W, + ParLiteral2W, ParLocaleW, ParNoCorrespondingW, - ParNumstrW, - ParUnresolvedProcE, + ParNumstrW, + ParUnresolvedProcE, SynApplyCommit, SynFileCodeSet, diff --git a/gcc/cobol/cdf-copy.cc b/gcc/cobol/cdf-copy.cc index 02c6240eaa35..e2878b33bbe3 100644 --- a/gcc/cobol/cdf-copy.cc +++ b/gcc/cobol/cdf-copy.cc @@ -280,14 +280,19 @@ copybook_elem_t::open_file( const char directory[], bool literally ) { dbgmsg("could not open %s: %s", path, xstrerror(errno)); return fd; } + struct stat sb; + if (fstat(fd, &sb)) { + error_msg(source.loc, "fstat %qs failed: %s", path, xstrerror(errno)); + } + else if (S_ISDIR(sb.st_mode)) { + error_msg(source.loc, "copybook %qs is a directory", path); + } this->source.name = path; if( ! cobol_filename(this->source.name, inode_of(fd)) ) { - error_msg(source.loc, "recursive copybook: '%s' includes itself", path); - (void)! close(fd); - fd = -1; - } else { - cbl_message(LexInputN, "opening %qs for input", source.name); + error_msg(source.loc, "recursive copybook: %qs includes itself", path); + goto failure; } + cbl_message(LexInputN, "opening %qs for input", source.name); return fd; } gcc_assert( ! literally ); @@ -314,17 +319,32 @@ copybook_elem_t::open_file( const char directory[], bool literally ) { auto filename = pattern.c_str(); if( (this->fd = open(filename, O_RDONLY)) != -1 ) { + struct stat sb; + if (fstat(fd, &sb)) { + error_msg(source.loc, "fstat %qs failed: %s", filename, + xstrerror(errno)); + goto failure; + } + else if (S_ISDIR(sb.st_mode)) { + error_msg(source.loc, "copybook %qs is a directory", filename); + goto failure; + } this->source.name = xstrdup(filename); if( ! cobol_filename(this->source.name, inode_of(fd)) ) { error_msg(source.loc, "recursive copybook: '%s' includes itself", this->source.name); - (void)! close(fd); - fd = -1; + + goto failure; } dbgmsg("%s: opened %s as fd %d", __func__, source.name, fd); return fd; } } +failure: + if (fd >= 0) { + (void)! close(fd); + } + return -1; } diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y index abfb7d6e3270..a4508d8d6dee 100644 --- a/gcc/cobol/cdf.y +++ b/gcc/cobol/cdf.y @@ -67,9 +67,9 @@ operator<<( std::ostream& os, cbl_loc_t const& loc ) { os << "(" << loc.first_line << "," - << loc.first_column + << loc.first_column << ") to (" - << loc.last_line + << loc.last_line << "," << loc.last_column << ")"; @@ -89,7 +89,7 @@ namespace cdf { lookahead_token_kind = token; return lookahead_token_kind; } - + bool had_lookahead() { int kind = 0; std::swap(kind, lookahead_token_kind); @@ -99,7 +99,7 @@ namespace cdf { #define SAVE_LOOKAHEAD cdf::lookahead(yyla.kind()) %} - + %code requires { namespace cdf { @@ -107,7 +107,7 @@ namespace cdf { } } -%code { +%code { // https://learnmoderncpp.com/2020/12/17/generating-c-programs-with-flex-and-bison-2/ namespace cdf { @@ -128,9 +128,9 @@ namespace cdf { } } } - + %define api.location.type {cbl_loc_t} - + %{ #define COUNT_OF(X) (sizeof(X) / sizeof(X[0])) @@ -206,7 +206,7 @@ void input_file_status_notify(); const cdfval_t& value, bool override = false ) { cdf_values_t& dictionary( cdf_dictionary() ); - + if( scanner_parsing() ) { if( ! override ) { if( dictionary.find(name) != dictionary.end() ) return false; @@ -218,7 +218,7 @@ void input_file_status_notify(); static void cdfval_off( const char name[] ) { cdf_values_t& dictionary( cdf_dictionary() ); - + if( scanner_parsing() ) { auto p = dictionary.find(name); if( p == dictionary.end() ) { @@ -245,7 +245,7 @@ void input_file_status_notify(); cdfval_t operator/( const cdfval_base_t& lhs, const cdfval_base_t& rhs ); cdfval_t negate( cdfval_base_t lhs ); - void cdf_unreachable(); + void cdf_unreachable(); void cdf_field_add( const cbl_loc_t&, const std::string& name, const cdfval_t& value ); cbl_file_t * cdf_file( size_t program, const cbl_name_t name ); size_t cdf_file_index( const cbl_file_t *file ); @@ -257,11 +257,11 @@ static char *display_msg; const char * keyword_str( int token ); exception_turn_t exception_turn; - + bool apply_cdf_turn( const exception_turn_t& turn ) { cbl_enabled_exceptions_t& enabled_exceptions( cdf_enabled_exceptions() ); - + for( auto elem : turn.exception_files() ) { std::set files(elem.second.begin(), elem.second.end()); enabled_exceptions.turn_on_off(turn.enabled, @@ -288,16 +288,16 @@ apply_cdf_turn( const exception_turn_t& turn ) { %printer { fprintf(stderr, "%s '%s'", keyword_str($$.token), $$.string? $$.string : "" ); } -// cppcheck-suppress invalidPrintfArgType_sint +// cppcheck-suppress invalidPrintfArgType_sint %printer { fprintf(stderr, "%ld '%s'", (long)$$.number, $$.string? $$.string : "" ); } - + %type NAME NUMSTR LITERAL PSEUDOTEXT %type LSUB RSUB SUBSCRIPT %type namelit name_any name_one %type name subscript subscripts inof %token BOOL -%token FEATURE 400 NUMBER 308 EXCEPTION_NAME 284 "EXCEPTION NAME" +%token FEATURE 397 NUMBER 305 EXCEPTION_NAME 284 "EXCEPTION NAME" %type cdf_expr %type cdf_relexpr cdf_reloper cdf_and cdf_bool_expr @@ -309,56 +309,56 @@ apply_cdf_turn( const exception_turn_t& turn ) { %type cdf_stackable -%token BY 520 -%token COPY 397 -%token CDF_DISPLAY 418 ">>DISPLAY" -%token IN 638 +%token BY 517 +%token COPY 394 +%token CDF_DISPLAY 415 ">>DISPLAY" +%token IN 635 %token NAME 290 -%token NUMSTR 310 "numeric literal" -%token OF 721 -%token PSEUDOTEXT 755 -%token REPLACING 777 -%token READY 405 TRACE 412 RESET 406 -%token LITERAL 303 -%token SUPPRESS 411 - -%token LSUB 402 "(" -%token SUBSCRIPT 410 RSUB 407 ")" - -%token CDF_DEFINE 417 ">>DEFINE" -%token CDF_IF 419 ">>IF" -%token CDF_ELSE 420 ">>ELSE" -%token CDF_END_IF 421 ">>END-IF" -%token CDF_EVALUATE 422 ">>EVALUATE" -%token CDF_WHEN 423 ">>WHEN" -%token CDF_END_EVALUATE 424 ">>END-EVALUATE" - -%token ALL 484 -%token CALL_CONVENTION 425 ">>CALL-CONVENTION" -%token COBOL_WORDS 414 ">>COBOL-WORDS" -%token CDF_PUSH 428 ">>PUSH" -%token CDF_POP 429 ">>POP" -%token SOURCE_FORMAT 430 ">>SOURCE FORMAT" - -%token AS 502 CONSTANT 396 DEFINED 398 +%token NUMSTR 307 "numeric literal" +%token OF 718 +%token PSEUDOTEXT 751 +%token REPLACING 773 +%token READY 402 TRACE 409 RESET 403 +%token LITERAL 300 +%token SUPPRESS 408 + +%token LSUB 399 "(" +%token SUBSCRIPT 407 RSUB 404 ")" + +%token CDF_DEFINE 414 ">>DEFINE" +%token CDF_IF 416 ">>IF" +%token CDF_ELSE 417 ">>ELSE" +%token CDF_END_IF 418 ">>END-IF" +%token CDF_EVALUATE 419 ">>EVALUATE" +%token CDF_WHEN 420 ">>WHEN" +%token CDF_END_EVALUATE 421 ">>END-EVALUATE" + +%token ALL 481 +%token CALL_CONVENTION 422 ">>CALL-CONVENTION" +%token COBOL_WORDS 411 ">>COBOL-WORDS" +%token CDF_PUSH 425 ">>PUSH" +%token CDF_POP 426 ">>POP" +%token SOURCE_FORMAT 427 ">>SOURCE FORMAT" + +%token AS 499 CONSTANT 393 DEFINED 395 %type DEFINED -%token OTHER 733 PARAMETER_kw 403 "PARAMETER" -%token OFF 722 OVERRIDE 404 -%token THRU 979 -%token TRUE_kw 848 "True" +%token OTHER 730 PARAMETER_kw 400 "PARAMETER" +%token OFF 719 OVERRIDE 401 +%token THRU 978 +%token TRUE_kw 844 "True" -%token CALL_COBOL 426 "CALL" -%token CALL_VERBATIM 427 "CALL (as C)" +%token CALL_COBOL 423 "CALL" +%token CALL_VERBATIM 424 "CALL (as C)" -%token TURN 850 CHECKING 530 LOCATION 682 ON 724 WITH 877 +%token TURN 846 CHECKING 527 LOCATION 679 ON 721 WITH 873 -%left OR 980 -%left AND 982 -%right NOT 983 -%left '<' '>' _EQ 302 "EQUAL" _NE 984 _LE 985 _GE 986 +%left OR 979 +%left AND 981 +%right NOT 982 +%left '<' '>' _EQ 299 "EQUAL" _NE 983 _LE 984 _GE 985 %left '-' '+' %left '*' '/' -%right NEG 988 +%right NEG 987 %require "3.8.2" // for C++ output %language "c++" @@ -509,7 +509,7 @@ cdf_define: CDF_DEFINE cdf_constant NAME as cdf_expr[value] override } ; cdf_constant: %empty - | CONSTANT + | CONSTANT ; override: %empty { $$ = false; } | OVERRIDE { $$ = true; } @@ -542,7 +542,7 @@ cdf_push: CDF_PUSH cdf_stackable { case parser::token::YDF_CDF_DEFINE: cdf_push_dictionary(); break; case parser::token::YDF_COBOL_WORDS: cdf_push_current_tokens(); break; case parser::token::YDF_SOURCE_FORMAT: - default: cdf_unreachable(); + default: cdf_unreachable(); } } ; @@ -553,7 +553,7 @@ cdf_pop: CDF_POP cdf_stackable { case parser::token::YDF_CDF_DEFINE: cdf_pop_dictionary(); break; case parser::token::YDF_COBOL_WORDS: cdf_pop_current_tokens(); break; case parser::token::YDF_SOURCE_FORMAT: - default: cdf_unreachable(); + default: cdf_unreachable(); } } ; @@ -624,7 +624,7 @@ cdf_if: CDF_IF cdf_cond_expr { ; cdf_evaluate: CDF_EVALUATE cdf_expr - | CDF_EVALUATE TRUE_kw + | CDF_EVALUATE TRUE_kw ; cdf_eval_when: CDF_WHEN cdf_eval_obj @@ -632,10 +632,10 @@ cdf_eval_when: CDF_WHEN cdf_eval_obj cdf_eval_obj: cdf_cond_expr | cdf_expr THRU cdf_expr - | OTHER + | OTHER ; -cdf_cond_expr: BOOL +cdf_cond_expr: BOOL | NAME DEFINED { cdf_values_t& dictionary( cdf_dictionary() ); @@ -868,7 +868,7 @@ namelit: name | LITERAL { $$ = cdf_arg_t{parser::token::YDF_LITERAL, $1}; } ; -name: NAME +name: NAME | name inof NAME { char *s = xasprintf( "%s %s %s", $1, $2, $3 ); @@ -895,7 +895,7 @@ subscripts: subscript $$ = s; } ; -subscript: SUBSCRIPT +subscript: SUBSCRIPT | LSUB subscript RSUB { char *s = xasprintf( "%s%s%s", $1, $2, $3 ); @@ -907,15 +907,15 @@ subscript: SUBSCRIPT ; as: %empty - | AS + | AS ; on: %empty - | ON + | ON ; with: %empty - | WITH + | WITH ; %% @@ -1088,11 +1088,10 @@ cdfval_base_t::operator()( const cbl_loc_t& loc ) { // cppcheck-suppress returnTempReference return verify_integer(loc, *this) ? *this : zero; } - + namespace cdf { void parser::error(cbl_loc_t const& loc, std::string const& msg) { error_msg(loc, msg.c_str()); } } - diff --git a/gcc/cobol/cobol1.cc b/gcc/cobol/cobol1.cc index 77671c94416c..46bdd129e9f3 100644 --- a/gcc/cobol/cobol1.cc +++ b/gcc/cobol/cobol1.cc @@ -344,7 +344,7 @@ cobol_option_lang_mask (void) { return CL_Cobol; } -bool use_static_call( bool yn ); +bool set_use_static_call( bool yn ); void add_cobol_exception( ec_type_t type, bool ); bool include_file_add(const char input[]); @@ -381,7 +381,6 @@ libcompat_copybook(const char *dir) { concat(gnu, dir_separator, "lib", NULL), concat(gnu, dir_separator, "cpy", NULL), - concat(gnu, dir_separator, "udf", NULL) }; for (size_t i = 0; i < sizeof paths / sizeof *paths; i++) @@ -442,7 +441,7 @@ void cobol_warning_suppress( cbl_dialect_t dialect ); /* * If an unrecognized/unimplmemented EC is specified, emit a warning. If the * warning is turned off, keep quiet. - * + * * Tue Aug 25 09:41:37 2026: For reasons unclear gcobol duplicates some * command-line options to cobol1. In any case if the user specifies the ssme * EC twice, or uses it more than once in the body of the code, he doesn't @@ -518,7 +517,7 @@ cobol_langhook_handle_option (size_t scode, return true; case OPT_fstatic_call: - use_static_call( arg? true : false ); + set_use_static_call( value != 0 ); return true; case OPT_fdefaultbyte: @@ -561,7 +560,7 @@ cobol_langhook_handle_option (size_t scode, case OPT_dialect: // gcc disallows 0 as an enumerated value, so we used 0x10 for iso. - if( cobol_dialect == 0x100 ) cobol_dialect = 0; + if( cobol_dialect == 0x100 ) cobol_dialect = 0; cobol_dialect_set(cbl_dialect_t(cobol_dialect)); cobol_warning_suppress(cbl_dialect_t(cobol_dialect)); return true; @@ -645,6 +644,10 @@ cobol_langhook_handle_option (size_t scode, cobol_warning(MfHexNumeric, hex_numeric, warning_as_error); return true; + case OPT_Wvalue_clause: + cobol_warning(MfValueClause, value_clause, warning_as_error); + return true; + case OPT_Winspect_trailing: cobol_warning(MfTrailing, inspect_trailing, warning_as_error); return true; diff --git a/gcc/cobol/compare.cc b/gcc/cobol/compare.cc index eabfe650082a..bca2bd6c4267 100644 --- a/gcc/cobol/compare.cc +++ b/gcc/cobol/compare.cc @@ -1078,6 +1078,32 @@ numeric_alpha_compare(tree &left, compared = true; } } + + if( !compared ) + { + if( left_side.field->type == FldNumericDisplay ) + { + right = integer_zero_node; + + int flags = left_side.all ? 2: 0 + + right_side.all ? 1: 0 ; + + tree right_offset = gg_cast(SIZE_T, refer_offset(right_side)); + tree length_right = refer_size_source(right_side); + tree left_offset = gg_cast(SIZE_T, refer_offset(left_side)); + left = gg_call_expr(INT, + "__gg__compare_numdisp_alpha", + gg_get_address_of(left_side.field->var_decl_node), + left_offset, + gg_get_address_of(right_side.field->var_decl_node), + right_offset, + length_right, + build_int_cst_type(INT, flags), + NULL_TREE); + compared = true; + } + } + if( !compared ) { // The left side is a fixed-point numeric of some kind. First, we pick diff --git a/gcc/cobol/gcobc b/gcc/cobol/gcobc index 6e0741cd61fa..b967428076d0 100755 --- a/gcc/cobol/gcobc +++ b/gcc/cobol/gcobc @@ -86,22 +86,25 @@ then copydir="-I$COB_COPY_DIR" fi -# TODO: this file likely needs to query gcobol for its shared path instead -udf_default="${0%/*}/../share/gcobol/udf" -if [ ! -d "$udfdir" ] +# if not available from the build tree, attempt to search the install directory. +udf_default="${0%/*}/../$($gcobol -dumpmachine)/libgcobol/compat/gnu/cpy" +if ! [ -d "$udf_default" ] then - # the one above is the installed one from the packages this one was previously used - udf_default="${0%/*}/../share/cobol/udf" + install_dir="$($gcobol -print-search-dirs | grep '^install:' | awk '{print $2}')" + udf_default="$install_dir/cobol/compat/gnu/cpy" fi udfdir="${GCOBCUDF:-$udf_default}" if [ -d "$udfdir" ] then - for F in "$udfdir"/* + # Feel free to add more UDFs below. + udfs=stored-char-length.cpy + + for F in $udfs do - if [ -f "$F" ] + if [ -f "$udfdir/$F" ] then - includes="$includes -include $F " + includes="$includes -include $udfdir/$F " fi done else @@ -229,6 +232,8 @@ do -echo) echo="echo" ;; + # note: if warnings on not implemented GC exceptions should be suppressed, + # then use -Wno-ec-unknown -fec=* | -fno-ec=*) opt="$(echo "$opt" | sed -E 's/-f(no-)?ec=/-f\1cobol-exceptions=EC-/g')" opts="$opts $opt" @@ -435,12 +440,16 @@ do ;; -i | --info) warn "$opt" ;; - -include ) - pending_arg=$opt + + # include a COBOL copybook --> gcobol's -include + --copy) + pending_arg="-include " # space-separation needed ;; - # no-space version: just concatenate - -include* ) - opts="$opts $opt" + # + + # include a C header --> no real option in gcobol + --include) + error "$opt $incomparable" ;; # # Options that may have a space before the argument, or not @@ -509,7 +518,7 @@ do ;; -q | --brief) warn "$opt" ;; - -v | --verbose) opts="$opts -V" + -v | --verbose) opts="$opts -v" ;; # -dumpversion, like all options not handled specifically, is # passed by default. @@ -522,7 +531,8 @@ do # opts="$opts --version" ;; # pass through, -Wall support pending gcc to set for all front ends - # cobc does not support all gcc -Wl options + # note: while cobc does not support gcc's -Wl options, they + # might be passed anyway for different reasons e.g.: -Wl,rpath. -w | -W | -Wextra | -Wno-* | -Wl,*) opts="$opts $opt" ;; @@ -558,7 +568,8 @@ done # cobc default: if [ "$static_used" = "" ] then - opts="-fno-static-call $opts"; + # -export-dynamic required if CALLs occur within the same executable. + opts="-fno-static-call -export-dynamic $opts"; fi if [ "$exit_status" -gt 0 ] diff --git a/gcc/cobol/gcobol.1 b/gcc/cobol/gcobol.1 index 21438c0568b0..185b00c6641a 100644 --- a/gcc/cobol/gcobol.1 +++ b/gcc/cobol/gcobol.1 @@ -97,6 +97,7 @@ .Op Fl Wno-redefines-grow .Op Fl Wno-set-locale-to .Op Fl Wno-set-to-locale +.Op Fl Wno-value-clause .Ar filename Op ... . .Sh DESCRIPTION @@ -719,6 +720,8 @@ Warn if SECTION segments are used. Warn if SET LOCALE ... TO is used. .It Fl Wno-set-to-locale Warn if SET ... TO LOCALE is used. +.It Fl Wno-value-clause +Warn if VALUE has too many trailing blanks. . `.\" convert errors to warnings Warn if a line directive is malformed (instead of error). @@ -1960,7 +1963,7 @@ If defined, specifies the directory paths to be used by the .Nm runtime library, .Pa libgcobol.so , -to locate shared objects. +to locate entry points in shared objects. Like .Ev LD_LIBRARY_PATH , it may contain several directory names separated by a colon @@ -1978,16 +1981,22 @@ when the executable loads is controlled by .Xr ld.so 8 , not libgcobol. .Pp -Each directory is searched for files whose name ends in -.Ql ".so" . -For each such file, +Each directory is searched for files whose names are based on the desired +symbol. As an example, consider a CALL to the program-id "FooBar". When the +.Sy CALL-CONVENTION COBOL +is operative, the symbol is forced to lowercase and an attempt is made to find +"FOOBAR.so", followed by an attempt to find "foobar.so". When +.Sy CALL-CONVENTION VERBATIM +is operative, attempts are made to find "FOOBAR.so", then "FooBar.so, and finally +"foobar.so". For each such file, .Xr dlopen 3 -is attempted, and, if successful -.Xr dlsym 3 . -No relationship is defined between the symbol's name and the filename. +is attempted, and if successful, +.Xr dlsym 3 is used to search for the +symbol. .Pp -Without -.Ev COBPATH , +When +.Ev COBPATH and +.Ev LD_LIBRARY_PATH are not explicitly used, binaries produced by .Nm behave as one might expect of any program compiled with gcc. Any diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index 71fc31852c36..acedc4a72503 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -32,6 +32,10 @@ #include "coretypes.h" #include "tree.h" +#include "stor-layout.h" +#include "ggc.h" +#include "gtype-desc.h" +#include "../../libgcobol/literal-call-descriptor.h" #include "tree-iterator.h" #include "stringpool.h" #include "diagnostic-core.h" @@ -155,7 +159,7 @@ static bool next_program_is_main = false; // transient switch for the module static char *main_entry_point = NULL; static bool static_call = true; -bool use_static_call( bool yn ) { return static_call = yn; } +bool set_use_static_call( bool yn ) { return static_call = yn; } static bool use_static_call() { return static_call; } // This global variable can be set upstream, like from a compiler @@ -806,6 +810,8 @@ function_pointer_from_name(const cbl_refer_t &name, NULL); tree function_pointer_type = build_pointer_type(function_type); + cbl_call_convention_t call_convention = current_call_convention(); + if( name.field->type == FldPointer ) { tree location; @@ -857,6 +863,7 @@ function_pointer_from_name(const cbl_refer_t &name, INT, current_function->our_symbol_table_index), gg_string_literal(name.field->data.original()), + build_int_cst_type(INT, call_convention), NULL_TREE)); } else @@ -872,6 +879,7 @@ function_pointer_from_name(const cbl_refer_t &name, gg_get_address_of(name.field->var_decl_node), refer_offset(name), refer_size_source(name), + build_int_cst_type(INT, call_convention), NULL_TREE)); } @@ -7565,7 +7573,7 @@ parser_label_goto(struct cbl_label_t *label) void parser_setop( struct cbl_field_t *tgt, - struct cbl_field_t *candidate, + struct cbl_refer_t &candidate, enum setop_t op, struct cbl_field_t *domain) { @@ -7574,7 +7582,7 @@ parser_setop( struct cbl_field_t *tgt, { SHOW_PARSE_HEADER SHOW_PARSE_FIELD(" ", tgt) - SHOW_PARSE_FIELD(" = ", candidate) + SHOW_PARSE_FIELD(" = ", candidate.field) if( op == is_op ) { SHOW_PARSE_TEXT(" is_op ") @@ -7584,13 +7592,13 @@ parser_setop( struct cbl_field_t *tgt, } CHECK_FIELD(tgt); - CHECK_FIELD(candidate); + CHECK_FIELD(candidate.field); CHECK_FIELD(domain); TRACE1 { TRACE1_HEADER - TRACE1_FIELD("parser_setop: ", candidate, "") + TRACE1_REFER("parser_setop: ", candidate, "") TRACE1_TEXT(" ") TRACE1_TEXT(setop_str(op)) TRACE1_FIELD(" ", domain, "") @@ -7602,25 +7610,28 @@ parser_setop( struct cbl_field_t *tgt, switch(op) { case is_op: - switch(candidate->type) + switch(candidate.field->type) { case FldGroup: case FldAlphanumeric: - gg_assign(tgt->var_decl_node, gg_build_relational_expression( - gg_call_expr(INT, - "__gg__setop_compare", - gg_get_address_of(candidate->var_decl_node), - member(domain, "initial"), - NULL_TREE), - ne_op, - integer_zero_node)); + gg_assign(tgt->var_decl_node, + gg_build_relational_expression(gg_call_expr( + INT, + "__gg__setop_compare", + gg_get_address_of(candidate.field->var_decl_node), + refer_offset(candidate), + refer_size_source(candidate), + member(domain, "initial"), + NULL_TREE), + ne_op, + integer_zero_node)); break; default: dbgmsg("%10s in %s:%d", __func__, __FILE__, __LINE__ ); cbl_internal_error("candidate %s has unimplemented % %d(%s)", - candidate->name, - candidate->type, - cbl_field_type_str(candidate->type)); + candidate.field->name, + candidate.field->type, + cbl_field_type_str(candidate.field->type)); gcc_unreachable(); break; } @@ -13030,8 +13041,9 @@ create_and_call(size_t narg, // Actually call the function, assigning the returned value to that // variable: + returned_value = gg_define_variable(interfunction_type); push_program_state(); - returned_value = call_expr; + gg_assign(returned_value, call_expr); pop_program_state(); // Now we decided what to do with the returned value, based on its type. @@ -13141,6 +13153,133 @@ create_and_call(size_t narg, } } +/* Cache one target-layout type and keep it reachable across GCC collections. + Dynamic root registration avoids requiring a new gengtype input file. */ +static tree literal_call_descriptor_type_node; + +static const struct ggc_root_tab literal_call_descriptor_roots[] = + { + { &literal_call_descriptor_type_node, 1, sizeof(tree), + >_ggc_mx_tree_node, >_pch_nx_tree_node }, + LAST_GGC_ROOT_TAB + }; + +static tree +literal_call_descriptor_type() + { + if( literal_call_descriptor_type_node != NULL_TREE ) + { + return literal_call_descriptor_type_node; + } + + ggc_register_root_tab(literal_call_descriptor_roots); + tree record = make_node(RECORD_TYPE); + literal_call_descriptor_type_node = record; + TYPE_NAME(record) = get_identifier("cblc_literal_call_descriptor"); + + tree const_char_pointer + = build_pointer_type(build_qualified_type(char_type_node, TYPE_QUAL_CONST)); + tree const_void_pointer + = build_pointer_type(build_qualified_type(void_type_node, TYPE_QUAL_CONST)); + +#define GCOBOL_CALL_FIELD_NAME(name, c_type, tree_type) #name, + const char *names[] = + { + GCOBOL_LITERAL_CALL_DESCRIPTOR_FIELDS(GCOBOL_CALL_FIELD_NAME) + }; +#undef GCOBOL_CALL_FIELD_NAME +#define GCOBOL_CALL_FIELD_TYPE(name, c_type, tree_type) tree_type, + tree types[] = + { + GCOBOL_LITERAL_CALL_DESCRIPTOR_FIELDS(GCOBOL_CALL_FIELD_TYPE) + }; +#undef GCOBOL_CALL_FIELD_TYPE + + tree *next = &TYPE_FIELDS(record); + for( size_t i = 0; i < sizeof(types) / sizeof(types[0]); i++ ) + { + tree member_decl = build_decl(UNKNOWN_LOCATION, + FIELD_DECL, + get_identifier(names[i]), + types[i]); + DECL_FIELD_CONTEXT(member_decl) = record; + *next = member_decl; + next = &DECL_CHAIN(member_decl); + } + *next = NULL_TREE; + layout_type(record); + return record; + } + +/* Emit a static initializer, not executable per-call assignments. */ +static tree +literal_call_descriptor(const cbl_refer_t &name, bool issue_warning) + { + tree record = literal_call_descriptor_type(); + tree literal = gg_string_literal(name.field->data.original()); + tree field = gg_get_address_of(name.field->var_decl_node); + tree warning_filename = null_pointer_node; + tree program_id + = build_int_cst(INT, current_function->our_symbol_table_index); + tree call_convention = build_int_cst_type(INT, current_call_convention()); + tree warning_line = integer_zero_node; + + if( issue_warning ) + { + warning_filename = gg_string_literal(current_filename.back().c_str()); + warning_line = build_int_cst_type(INT, CURRENT_LINE_NUMBER); + } + +#define GCOBOL_CALL_FIELD_VALUE(name, c_type, tree_type) name, + tree values[] = + { + GCOBOL_LITERAL_CALL_DESCRIPTOR_FIELDS(GCOBOL_CALL_FIELD_VALUE) + }; +#undef GCOBOL_CALL_FIELD_VALUE + + vec *elts = NULL; + tree member_decl = TYPE_FIELDS(record); + for( size_t i = 0; i < sizeof(values) / sizeof(values[0]); i++ ) + { + tree value = gg_cast(TREE_TYPE(member_decl), values[i]); + CONSTRUCTOR_APPEND_ELT(elts, member_decl, value); + member_decl = DECL_CHAIN(member_decl); + } + gcc_assert(member_decl == NULL_TREE); + + tree initializer = build_constructor(record, elts); + gcc_assert(TREE_CONSTANT(initializer)); + TREE_STATIC(initializer) = 1; + + // vs_static supplies a unique name and roots the declaration in its function. + tree descriptor = gg_define_variable(record, vs_static); + TREE_READONLY(descriptor) = 1; + DECL_ARTIFICIAL(descriptor) = 1; + DECL_IGNORED_P(descriptor) = 1; + DECL_INITIAL(descriptor) = initializer; + return gg_get_address_of(descriptor); + } + +static tree +function_pointer_for_literal_call(const cbl_refer_t &name, + tree function_return_type, + bool issue_warning) + { + tree function_type = build_varargs_function_type_array( + function_return_type, + 0, + NULL); + tree function_pointer_type = build_pointer_type(function_type); + tree descriptor = literal_call_descriptor(name, issue_warning); + + return gg_cast( + function_pointer_type, + gg_call_expr(VOID_P, + "__gg__resolve_literal_call_descriptor", + descriptor, + NULL_TREE)); + } + void parser_call( cbl_refer_t name, cbl_refer_t returned, // This is set by RETURNING clause @@ -13150,9 +13289,6 @@ parser_call( cbl_refer_t name, cbl_label_t *not_except, bool /*is_function*/) { - // A note on the processing of function return types: - - Analyze(); SHOW_PARSE { @@ -13262,9 +13398,23 @@ parser_call( cbl_refer_t name, } else { - tree function_pointer = function_pointer_from_name( name, - interfunction_type); - // We might not have a good handle, so we have to check: + const bool literal_call = name.field->type == FldLiteralA; + const bool issue_warning + = !except && !cdf_enabled_exceptions().match(ec_program_not_found_e); + + tree function_pointer; + if( literal_call ) + { + function_pointer = function_pointer_for_literal_call(name, + interfunction_type, + issue_warning); + } + else + { + function_pointer = function_pointer_from_name(name, interfunction_type); + } + function_pointer = save_expr(function_pointer); + IF( function_pointer, ne_op, gg_cast(TREE_TYPE(function_pointer), null_pointer_node) ) @@ -13279,47 +13429,34 @@ parser_call( cbl_refer_t name, } ELSE { - // We have a bad function pointer, which is the exception condition: - // Set the exception message to "name" - gg_call(VOID, - "__gg__set_exception_call", - gg_get_address_of(name.field->var_decl_node), - refer_offset(name), - NULL_TREE); - parser_exception_raise(ec_program_not_found_e); + /* The literal resolver has already recorded lookup failure. + Variable-name calls retain their existing bookkeeping. */ + if( !literal_call ) + { + gg_call(VOID, + "__gg__set_exception_call", + gg_get_address_of(name.field->var_decl_node), + refer_offset(name), + NULL_TREE); + parser_exception_raise(ec_program_not_found_e); + } + if( except ) { - // We have an ON EXCEPT clause: - gg_append_statement( except->structs.call_exception->into.go_to ); - // Because there is an ON EXCEPTION clause, suppress DECLARATIVE - // processing + // Preserve the existing ON EXCEPTION routing and reset placement. + gg_append_statement(except->structs.call_exception->into.go_to); gg_assign(var_decl_exception_code, integer_zero_node); } - else + else if( !literal_call && issue_warning ) { - // When EC-PROGRAM-NOT-FOUND is not enabled, we issue a warning. - const cbl_enabled_exceptions_t& - enabled_exceptions( cdf_enabled_exceptions() ); - if( !enabled_exceptions.match(ec_program_not_found_e) ) - { - tree mangled_name = gg_define_variable(CHAR_P); - - gg_call(VOID, - "__gg__just_mangle_name", - (name.field->var_decl_node - ? gg_get_address_of(name.field->var_decl_node) - : null_pointer_node), - gg_get_address_of( mangled_name), - NULL_TREE); - - gg_printf("WARNING: %s:%d \"CALL %s\" not found" - " with no \"CALL ON EXCEPTION\" phrase.\n" - "(You might need -rdynamic or --export-dynamic for symbols in the executable.)\n", - gg_string_literal(current_filename.back().c_str()), - build_int_cst_type(INT, CURRENT_LINE_NUMBER), - mangled_name, - NULL_TREE); - } + gg_call(VOID, + "__gg__call_warning_message", + (name.field->var_decl_node + ? gg_get_address_of(name.field->var_decl_node) + : null_pointer_node), + gg_string_literal(current_filename.back().c_str()), + build_int_cst_type(INT, CURRENT_LINE_NUMBER), + NULL_TREE); } } ENDIF @@ -13601,12 +13738,27 @@ parser_set_pointers( size_t ntgt, cbl_refer_t *tgts, cbl_refer_t source ) && (source.field->type == FldAlphanumeric || source.field->type == FldLiteralA)) { - // This is something like SET varp TO ENTRY "ref". - tree function_pointer = function_pointer_from_name(source, - COBOL_FUNCTION_RETURN_64); - gg_memcpy(qualified_data_location(tgts[i]), - gg_get_address_of(function_pointer), - sizeof_pointer); + if( strcmp(source.field->name, "ZEROES") == 0 ) + { + // This is an extra-special corner case. No, it's worse than a corner + // case. It's a pointy case. The caller is essentially setting the + // pointer to the figurative constant ZEROES. But ZERO is both an + // alphanumeric and a numeric, depending on context. Fine. It's + // weird. Let's just set the destination to zeroes, and be done with + // it. + gg_memset(qualified_data_location(tgts[i]), + integer_zero_node, + sizeof_pointer); + } + else + { + // This is something like SET varp TO ENTRY "ref". + tree function_pointer = function_pointer_from_name(source, + COBOL_FUNCTION_RETURN_64); + gg_memcpy(qualified_data_location(tgts[i]), + gg_get_address_of(function_pointer), + sizeof_pointer); + } } else { @@ -14431,7 +14583,14 @@ actually_create_the_static_field( cbl_field_t *new_var, } tree offset = build_int_cst_type(SIZE_T, new_var->offset); tree name = gg_string_literal(new_var->name); - tree picture = gg_string_literal(new_var->data.picture); + + char *expanded = expand_picture(new_var->data.picture); + if( new_var->type == FldNumericEdited ) + { + expand_expanded(expanded); + } + tree picture = gg_string_literal(expanded); + free(expanded); tree initial; if( length_of_initial_string == 0 || !new_var->data.has_initial_value() ) { diff --git a/gcc/cobol/genapi.h b/gcc/cobol/genapi.h index 0f20f4dfd337..6cd8eed07e1b 100644 --- a/gcc/cobol/genapi.h +++ b/gcc/cobol/genapi.h @@ -187,7 +187,9 @@ parser_logop( struct cbl_field_t *tgt, void parser_setop( struct cbl_field_t *tgt, - struct cbl_field_t *a, enum setop_t, struct cbl_field_t *b ); + struct cbl_refer_t &candidate, + enum setop_t, + struct cbl_field_t *b ); void parser_bitop( struct cbl_field_t *tgt, diff --git a/gcc/cobol/lang-specs.h b/gcc/cobol/lang-specs.h index ace1dfa06801..43198041a788 100644 --- a/gcc/cobol/lang-specs.h +++ b/gcc/cobol/lang-specs.h @@ -34,7 +34,7 @@ {".CBL", "@cobol", 0, 0, 0}, {"@cobol", "cobol1 %i %(cc1_options) " - "%{B*} %{D*} %{E} %{I*} %{M} %{fmax-errors*} %{fsyntax-only*} " + "%{I*} %{B*} %{D*} %{E} %{M} %{fmax-errors*} %{fsyntax-only*} " "%{idirafter}" "%{fcobol-exceptions*} " "%{copyext} " @@ -78,6 +78,7 @@ "%{Wiconv-error} %{Wno-iconv-error} " "%{Winclude-file-found} %{Wno-include-file-found} " "%{Winclude-file-not-found} %{Wno-include-file-not-found} " + "%{Wvalue-clause} %{Wno-value-clause} " "%{Winspect-trailing} %{Wno-inspect-trailing} " "%{Wlength-of} %{Wno-length-of} " "%{Wlevel-1-occurs} %{Wno-level-1-occurs} " @@ -110,4 +111,3 @@ "%{nomain} " "%{!fsyntax-only:%(invoke_as)} " , 0, 0, 0}, - diff --git a/gcc/cobol/lang.opt b/gcc/cobol/lang.opt index 0d381a3394e3..413796daba26 100644 --- a/gcc/cobol/lang.opt +++ b/gcc/cobol/lang.opt @@ -154,6 +154,11 @@ Wdisplay-screen Cobol Warning Var(display_screen, 1) Init(1) Warn if DISPLAY WITH screen options is used. +; MfInitialValue +Wvalue-clause +Cobol Warning Var(value_clause, 1) Init(1) +Warn if VALUE has too many trailing blanks. + ; MfTrailing Winspect-trailing Cobol Warning Var(inspect_trailing, 1) Init(1) @@ -436,7 +441,7 @@ Cobol RejectNegative Joined Separate UInteger Var(indicator_column) Init(0) Inte -findicator-column= Column after which Region A begins. fstatic-call -Cobol Var(cobol_static_call, 1) Init(1) +Cobol Var(cobol_static_call) Init(1) Enable/disable static linkage for CALL literals. ftrace-debug diff --git a/gcc/cobol/lexio.cc b/gcc/cobol/lexio.cc index e6e8ffcf6531..71bc21edefa3 100644 --- a/gcc/cobol/lexio.cc +++ b/gcc/cobol/lexio.cc @@ -445,20 +445,28 @@ struct buffer_t : public bytespan_t { } }; -static inline bool is_p( char ch ) { return TOUPPER(ch) == 'P'; } +static inline bool is_pf( char ch ) { return TOUPPER(ch) == 'P' || TOUPPER(ch) == 'F'; } static bool is_program_id( const char *p, const char *eol ) { - static const std::string program_id("PROGRAM-ID"); - auto eop = p + program_id.size(); - if( eop < eol ) { - // PROGRAM-ID must be followed by a dot, perhaps with intervening whitespace. - for( const char *dot=eop; dot < eol && *dot != '.'; dot++ ) { - if( !ISSPACE(*dot) ) return false; + static const std::vector ids { "PROGRAM-ID", "FUNCTION-ID" }; + for( const auto& id : ids ) { + auto eop = p + id.size(); + if( eop < eol ) { + bool valid = true; + // PROGRAM-ID must be followed by a dot, perhaps with intervening whitespace. + for( const char *dot=eop; dot < eol && *dot != '.'; dot++ ) { + if( !ISSPACE(*dot) ) { + valid = false; + break; + } + } + if (!valid) + continue; + std::string line (p, eop); + std::transform(line.begin(), line.end(), line.begin(), ::toupper); + return line == id; } - std::string line (p, eop); - std::transform(line.begin(), line.end(), line.begin(), ::toupper); - return line == program_id; } return false; } @@ -1689,7 +1697,7 @@ static const char * valid_sequence_area( const char *data, const char *eodata ) { for( const char *p = data; // find every 'P' to try Program-ID - (p = std::find_if(p, eodata, is_p)) != eodata; + (p = std::find_if(p, eodata, is_pf)) != eodata; p++ ) { auto eol = std::find(p, eodata, '\n'); diff --git a/gcc/cobol/messages.cc b/gcc/cobol/messages.cc index 468e6754293f..dd3c4f8862fb 100644 --- a/gcc/cobol/messages.cc +++ b/gcc/cobol/messages.cc @@ -165,6 +165,7 @@ std::set cbl_diagnostics { { MfSetNumeric, "-Wset-numeric", diagnostics::kind::error, dialect_mf_gnu }, { MfTrailing, "-Winspect-trailing", diagnostics::kind::error, dialect_mf_gnu }, { MfUsageTypename, "-Wusage-typename", diagnostics::kind::error, dialect_mf_gnu }, + { MfValueClause, "-Wvalue-clause", diagnostics::kind::error, dialect_mf_gnu }, { LexIncludeE, "-Winclude-file-not-found", diagnostics::kind::error }, { LexIncludeOkN, "-Winclude-file-found", diagnostics::kind::note }, diff --git a/gcc/cobol/move.cc b/gcc/cobol/move.cc index 6c7f8e0c11a7..685fee287056 100644 --- a/gcc/cobol/move.cc +++ b/gcc/cobol/move.cc @@ -201,7 +201,8 @@ mh_source_is_literalN(cbl_refer_t &destref, tree size_error) { bool moved = false; - if( sourceref.field->type == FldLiteralN ) + if( sourceref.field->type == FldLiteralN + && destref.field->type != FldNumericEdited ) { Analyze(); switch( destref.field->type ) @@ -348,7 +349,6 @@ mh_source_is_literalN(cbl_refer_t &destref, case FldNumericDisplay: case FldNumericBinary: - case FldNumericEdited: case FldPacked: { SHOW_PARSE1 @@ -1656,6 +1656,109 @@ mh_binary_to_packed(const cbl_refer_t &destref, return moved; } +static bool +mh_to_numeric_edited(const cbl_refer_t &destref, + const cbl_refer_t &sourceref, + cbl_round_t rounded, + tree size_error) + { + bool moved = false; + + if( destref.field->type == FldNumericEdited + && destref.field->codeset.stride() == 1 + && !(destref.field->attr & scaled_e) + && (!(sourceref.field->attr & intermediate_e) || sourceref.field->type == FldLiteralN) + + && ( sourceref.field->type == FldNumericBinary + || sourceref.field->type == FldNumericBin5 + || sourceref.field->type == FldNumericDisplay + || sourceref.field->type == FldLiteralN + || sourceref.field->type == FldIndex + || sourceref.field->type == FldPointer ) ) + { + const charmap_t *charmap = __gg__get_charmap(destref.field->codeset.encoding); + if( !charmap->is_like_ebcdic() ) + { + tree value = get_binary_value(sourceref, INT128); + + int scaler = 0; + int rdigits = sourceref.field->data.rdigits; + if( sourceref.field->attr & scaled_e) + { + if( sourceref.field->data.rdigits < 0 ) + { + // This is like 9999PPP, where rdigits = -3 + scaler = sourceref.field->data.rdigits; + rdigits = 0; + } + else + { + // This is like PPP9999, where rdigits=3 and digits=4 + rdigits = sourceref.field->data.digits + + sourceref.field->data.rdigits; + } + } + // We have to make the source decimal point position line up with that of + // the destination. + scaler = destref.field->data.rdigits - rdigits - scaler; + + // To line up the decimal points we multiply value by 10**scaler + if( scaler > 0 ) + { + FIXED_WIDE_INT(128) power_of_ten = get_power_of_ten( scaler ); + tree pot = wide_int_to_tree(INT128, power_of_ten); + value = gg_multiply(value, pot); + } + else if( scaler < 0 ) + { + FIXED_WIDE_INT(128) power_of_ten = get_power_of_ten( -scaler ); + tree pot = wide_int_to_tree(INT128, power_of_ten); + value = gg_call_expr(INT128, + "__gg__int128_to_int128_rounded", + build_int_cst_type(INT, rounded), + value, + pot, + NULL_TREE); + } + // The decimal points are lined up. + if( size_error ) + { + FIXED_WIDE_INT(128) power_of_ten = + get_power_of_ten( destref.field->data.digits ); + tree mask = wide_int_to_tree(INT128, power_of_ten); + IF( gg_abs(value), ge_op, mask ) + { + gg_assign(gg_indirect(size_error), + gg_bitwise_or(gg_indirect(size_error), + integer_one_node)); + } + ELSE + { + gg_call(INT, + "__gg__int128_to_ascii_numeric_display", + gg_get_address_of(destref.field->var_decl_node), + get_location(destref), + value, + NULL_TREE); + } + ENDIF + } + else + { + gg_call(INT, + "__gg__int128_to_ascii_numeric_display", + gg_get_address_of(destref.field->var_decl_node), + get_location(destref), + value, + NULL_TREE); + } + moved = true; + } + } + + return moved; + } + static void copy_native_into_place(cbl_field_t *dest, tree dest_offset, @@ -3634,6 +3737,14 @@ move_helper(tree size_error, // This is an INT size_error); } + if( !moved ) + { + moved = mh_to_numeric_edited(destref, + sourceref, + rounded, + size_error); + } + if( !moved ) { SHOW_PARSE1 diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 6434c2685fb2..441c4de259ea 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -54,8 +54,11 @@ class ast_op_t; + struct cbl_field_data_t; +#include "semantic_token.h" + struct coll_alphanat_t { - const char *alpha, *national; + const char *alpha, *national; }; struct label_pair_t { @@ -69,7 +72,7 @@ int token; cbl_refer_t *value; }; - + class locale_tgt_t { char user_system_default; std::vector categories; @@ -92,7 +95,7 @@ class locale_tgt_t { categories.push_back(token); return *this; } - + bool is_default() const { return 0 < user_system_default; } char default_of() const { assert(categories.empty()); @@ -146,10 +149,10 @@ class locale_tgt_t { cbl_encoding_t encode_as() const { switch(prefix[0]) { case '\0': - case 'X': - case 'Z': + case 'X': + case 'Z': return current_encoding('A'); - case 'N': + case 'N': return current_encoding('N'); default: dbgmsg("no such prefix '%s'", prefix); @@ -336,7 +339,7 @@ class locale_tgt_t { %define api.location.type {cbl_loc_t} %{ -// yyssa never freed: +// yyssa never freed: // https://lists.nongnu.org/archive/html/help-bison/2021-01/msg00021.html #pragma GCC diagnostic ignored "-Wfree-nonheap-object" @@ -398,10 +401,8 @@ class locale_tgt_t { NAME NAME88 "Level 88 NAME" NUME "Name" - NUMED "NUMERIC-EDITED picture" - NUMED_CR "NUMERIC-EDITED CR picture" - NUMED_DB "NUMERIC-EDITED DB picture" -%token NINEDOT NINES NINEV PIC_P "PICTURE P symbol" ONES +%token PICTURE +%token NINES NINEV PIC_P "PICTURE P symbol" ONES %token SPACES _EQ "EQUAL" %token LITERAL %token END EOP @@ -418,7 +419,7 @@ class locale_tgt_t { %token PROCESS SECTION %token STANDARD_ALPHABET "STANDARD ALPHABET" %token SWITCH -%token UPSI +%token UPSI %token ZERO /* environment names */ @@ -440,7 +441,7 @@ class locale_tgt_t { /* tokens without semantic value */ /* CDF (COPY and >> defined here but used in cdf.y) */ - + %token // CDF Flag-02 operands FLAG_02 MOVE_TO_SAME_NAME @@ -460,10 +461,10 @@ class locale_tgt_t { ZERO_LENGTH // boolean operators - B_AND B_NOT B_OR + B_AND B_NOT B_OR B_SHIFT_L B_SHIFT_LC B_SHIFT_R B_SHIFT_RC B_XOR - + BASIS CBL CONSTANT COPY DEFINED ENTER FEATURE INSERTT LSUB "(" @@ -631,7 +632,7 @@ class locale_tgt_t { PACKED_DECIMAL PADDING PAGE PAGE_COUNTER "PAGE-COUNTER" - PF PH PI PIC PICTURE + PF PH PI PIC PLUS PRESENT_VALUE PRINT_SWITCH PROCEDURES PROCEED PROCESSING PROGRAM_ID "PROGRAM-ID" @@ -679,7 +680,7 @@ class locale_tgt_t { TRY TURN TYPE TYPEDEF ULENGTH UNBOUNDED UNIT UNITS UNIT_RECORD UNTIL - UP UPON UPOS UPPER_CASE USAGE USING + UP UPON UPOS UPPER_CASE USAGE USING USUBSTR USUPPLEMENTARY UTILITY UUID4 UVALID UWIDTH VALIDATING VALUE VARIANCE VARYING VOLATILE @@ -774,9 +775,9 @@ class locale_tgt_t { %type true_false posneg eval_posneg %type open_io alphabet_etc %type device_name -%type numed context_word ctx_name locale_spec selected_file -%type char_class_locales coll_alphanats -%type coll_alphanat +%type context_word ctx_name locale_spec selected_file +%type char_class_locales coll_alphanats +%type coll_alphanat %type namestr alphabet_lit program_as repo_as %type perform_cond kind_of_name %type alloc_ret @@ -814,7 +815,7 @@ class locale_tgt_t { %type filename read_body write_body delete_body %type