Π Π΅Π»ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° компиляторов LLVM 21

ПослС ΡˆΠ΅ΡΡ‚ΠΈ мСсяцСв Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСдставлСС Ρ€Π΅Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM 21.1.0, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ инструмСнтарий (компиляторы, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚ΠΊΠΎΠ΄ RISC-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… инструкций (низкоуровнСвая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина с ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ систСмой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ). Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ псСвдокод ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ»ΠΈ использован JIT-компилятором для формирования ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… инструкций нСпосрСдствСнно Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. На Π±Π°Π·Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ LLVM ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ развиваСтся компилятор Clang, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ языки программирования C, C++ ΠΈ Objective-C. Начиная с Π²Π΅Ρ‚ΠΊΠΈ 18.x ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π½Π° Π½ΠΎΠ²ΡƒΡŽ схСму формирования Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² вСрсий, Π² соотвСтствии с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ выпуск (Β«N.0Β») ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π° пСрвая ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ вСрсия снабТаСтся Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Β«N.1Β».

Π‘Ρ€Π΅Π΄ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ Π² Clang 21:

  • ВозмоТности, связанныС с Π‘++:
    • По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с GCC Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования константных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ассСмблСрных вставках, опрСдСляСмых Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Β«asmΒ»: int foo() { asm((std::string_view(Β«nopΒ»)) ::: (std::string_view(Β«memoryΒ»))); }
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Β«newΒ» ΠΈ Β«deleteΒ», ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Β«std::type_identity<T>Β», Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ выдСляСтся ΠΈΠ»ΠΈ освобоТдаСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вычислСния лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… структурированныС привязки (structured binding), Π½Π° этапС компиляции Π² контСкстС константного выраТСния.
  • ВозмоТности, связанныС с Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΌ стандартом C++2с (C++26):
    • Π’ структурированныС привязки Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования синтаксиса «…» для указания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (pack), Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ число элСмСнтов ΠΈΠ· присваиваСмой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. auto [x,y,z] = f(); // Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ x, y, z Π±ΡƒΠ΄ΡƒΡ‚ записаны Ρ‚Ρ€ΠΈ элСмСнта, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅ f(). auto […xs] = f(); // Π² ΠΏΠ°ΠΊΠ΅Ρ‚ xs Π±ΡƒΠ΄ΡƒΡ‚ записаны всС элСмСнты, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½Ρ‹Π΅ f(). auto [x, …rest] = f(); // Π’ x Π±ΡƒΠ΄Π΅Ρ‚ записан ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π° Π² rest β€” ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. auto [x, y, …rest] = f(); // Π’ x Π±ΡƒΠ΄Π΅Ρ‚ записан ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, Π² y β€” Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π° Π² rest β€” Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ. auto [x, …rest, z] = f(); // Π² x β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π² rest β€” Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π² z β€” Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Β«Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ пСрСмСщаСмости» Ρ‚ΠΈΠΏΠΎΠ² (Trivial Relocatability), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСмСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² памяти Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° конструкторов ΠΈΠ»ΠΈ дСструкторов. Для классов Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ свойства memberwise_trivially_relocatable ΠΈ memberwise_replaceable, Π° для Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ пСрСмСщСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ trivially_relocate_at ΠΈ trivially_relocate.
    • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния структурированного связывания (structured binding) Π² качСствС условия Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… if ΠΈ switch.
    • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прикрСплСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… модулях.
  • ВозмоТности, Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ стандарта C2y:
    • УстранСно Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ void Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… контСкстах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«(void)(void)1;Β».
    • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с исходным ΠΊΠΎΠ΄ΠΎΠΌ символом Π½ΠΎΠ²ΠΎΠΉ строки.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ прСфиксы для Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² β€” 0o ΠΈ 0O, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Β«\o{…}Β» ΠΈ \x{…}. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² 0xxx объявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ. НапримСр, Β«0o123Β» ΠΈ Β«\o{123}Β» вмСсто Β«0123Β».
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«_CountofΒ» для опрСдСлСния количСства элСмСнтов Π² массивС. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» stdcountof.h, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ макроса Β«countofΒ», Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· Β«_CountofΒ».
  • ВозмоТности, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Π‘ΠΈ-стандартС C23:
    • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ tag‑типы (struct, union, enum) Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° трансляции, Ссли ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ опрСдСлСния структурно эквивалСнтны (Ρ‚ΠΎ ΠΆΠ΅ число Ρ‡Π»Π΅Π½ΠΎΠ², ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΈΠΌΠ΅Π½Π° Ρ‚Π΅Π³ΠΎΠ²).
    • Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΎ использованиС списков с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (variadic). Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ°.
    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° совмСстимая с GCC встроСнная функция Β«__builtin_c23_va_start()Β», ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ диагностики для макроса va_start() Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ C23.
  • Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ совмСстимости с компилятором MSVC Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ использованиС спСцификатора inline ΠΏΡ€ΠΈ объявлСнии Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· typedef, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«typedef int inline Foo(int);Β»
  • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Β«restrictΒ» для Ρ‚ΠΈΠΏΠΎΠ² массивов с элСмСнтами-указатСлями.
  • НовыС прСдупрСТдСния компилятора:
    • Β«-Wdefault-const-init-varΒ» ΠΈ Β«-Wdefault-const-init-fieldΒ» β€” выявлСниС ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ const ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π±Π΅Π· явной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
    • Β«-Wimplicit-void-ptr-castΒ» β€” выводится ΠΏΡ€ΠΈ нСявном ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ· Ρ‚ΠΈΠΏΠ° Β«void*Β» Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ указатСля.
    • Β«-Wc++-keywordΒ» β€” выводится ΠΏΡ€ΠΈ использовании ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Β«C++Β» Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² Β«CΒ».
    • Β«-Wc++-hidden-declΒ» β€” выявлСниС использования Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π΅Π³ΠΎΠ², Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… Π² Β«CΒ», Π½ΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… Π² Β«C++Β» ΠΈΠ·-Π·Π° ограничСния области видимости.
    • Β«-Wimplicit-int-enum-castΒ» β€” выявлСниС нСявных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π² Π‘-ΠΊΠΎΠ΄Π΅ ΠΈΠ· цСлочислСнных Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ‚ΠΈΠΏ пСрСчислСний, нСсовмСстимых с Β«C++Β».
    • Β«-Wtentative-definition-compatΒ» β€” диагностика ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π² Β«CΒ» с нСсколькими опрСдСлСниями, нСсовмСстимыми с Β«C++Β».
    • Β«-Wunterminated-string-initializationΒ» ΠΈ Β«-Wc++-unterminated-string-initializationΒ» β€” выявлСниС ситуаций ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ· строкового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сохранён Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄Π΅ Π½Π° Π‘ΠΈ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«nonstringΒ».
    • Β«-Wjump-misses-initΒ» β€” диагностика ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· goto ΠΈΠ»ΠΈ switch/case, ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
    • Β«-Wundef-trueΒ» β€” ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ± использовании значСния Β«trueΒ» Π² прСпроцСссорС C Π±Π΅Π· опрСдСлСния.
    • Β«-WnrvoΒ» β€” диагностика ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… NRVO (Named Return Value Optimization).
  • НовыС Ρ„Π»Π°Π³ΠΈ компилятора:
    • Β«-fprofile-continuousΒ» β€” Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ синхронизации профиля Π² Ρ„Π°ΠΉΠ».
    • Β«-ftime-report-jsonΒ» β€” Π²Ρ‹Π²ΠΎΠ΄ свСдСний ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.
    • Β«-ignore-pchΒ» β€” ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ².
    • Β«-fthinlto-distributorΒ» ΠΈ Β«-Xthinlto-distributorΒ» β€” для примСнСния DTLTO (Integrated Distributed ThinLTO).
    • Β«-static-libclosureΒ» β€” для статичСского связывания runtime Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Blocks Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Windows.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ срСдства диагностики ΠΈ статичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ (Π±ΠΎΠ»Π΅Π΅ сотни ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ, связанных с диагностикой).
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ бэкСнды для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS ΠΈ PowerPC. Π’ бэкСнд для RISC-V Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ассСмблСра для [[https://llvm.org/docs/RISCVUsage.html Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉΡŠΡŠ Qualcomm uC, Andes ΠΈ SiFive.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ