第 5 章 LLVM Toolset 中的更改
LLVM Toolset 在 RHEL 8 和 RHEL 9 上已从 17.0.6 更新至 18.1.8。
重要的 LLVM 更新:
-
以下指令的常量表达式变体已删除:
and,or,lshr,ashr,zext,sext,fptrunc,fpext,fptoui,fptosi,uitofp,sitofp. -
添加了
llvm.exp10内在函数。 -
添加了全局变量的
code_model属性。 - 改进了 AArch64, AMDGPU, PowerPC, RISC-V, SystemZ 和 x86 架构的后端。
- LLVM 工具已改进。
显著的 Clang 改进:
C++20 功能支持:
-
clang 不再执行 One Definition Rule(ODR)来检查全局模块片段中的声明。要启用更严格的行为,请使用
-Xclang -fno-skip-odr-check-in-gmf选项。
-
clang 不再执行 One Definition Rule(ODR)来检查全局模块片段中的声明。要启用更严格的行为,请使用
C++23 功能支持:
-
添加了一个新的诊断标记
-Wc++23-lambda-attributes,以警告对 lambdas 使用属性。
-
添加了一个新的诊断标记
C++2c 功能支持:
-
clang 现在允许在同一范围内多次使用
_字符作为占位符变量名称。 - 在是字符串文字的属性参数中,属性现在期望未评估的字符串。
- 对 C++26 中弃用的枚举的算术转换已删除。
- 改进了模板参数初始化的规范。
-
clang 现在允许在同一范围内多次使用
- 有关更改的完整列表,请参阅 Clang 的上游发行注记。
Clang 中的 ABI 变化:
-
按照 x86_64 的 SystemV ABI ,
__int128参数不再在寄存器和堆栈插槽之间拆分。 - 如需更多信息,请参阅 Clang 中 ABI 变化的列表。
重要的后向不兼容变化:
- 模板运算符的反向参数顺序中的 bug 修复破坏了之前在 C++17 中接受的 C++20 中的代码。
-
GCC_INSTALL_PREFIXCMake 变量(其设置默认的-gcc-toolchain=)已被弃用,并将被删除。改为在配置文件中指定--gcc-install-dir=或--gcc-triple=选项。 -
预编译标头(PCH)生成(
-c -xc-header和-c -xc++-header)的默认扩展名称是.pch而不是.gch。 -
当
-include a.h探测a.h.gch文件时,如果a.h.gch 不是 Clang PCH 文件或包含任何 Clang PCH 文件的目录,则 include 现在忽略a.h.gch。 -
修复了对某些 C++-11-style 属性导致
__has_cpp_attribute和__has_c_attribute返回错误值的 bug 。 -
在添加反向
operator==时查找匹配的operator!=的 bug 已修复。 - 功能模板的名称修改规则已更改为接受函数可以在其模板参数列表或 requires 子句上超载。
-
现在,在系统标头和宏上默认启用
-Wenum-constexpr-conversion警告。在下一个 Clang 版本中,它将被转换为一个硬(不可升级)错误。 - 用于 C++20 命名的模块的导入模块的路径不再被硬编码。您必须从命令行指定所有依赖的模块。
-
不再可能使用
import <module>来导入模块;Clang 使用明确构建的模块。 - 如需了解更多详细信息,请参阅 可能破坏更改的列表。
有关更新的详细信息,请参阅上游 LLVM 发行注记 和 Clang 发行注记。