Clang 20.0.0git (开发中) 版本说明¶
由 LLVM 团队 编写
警告
这些是即将发布的 Clang 20 版本的开发中说明。以前版本的版本说明可在 发布页面 上找到。
简介¶
本文档包含 Clang C/C++/Objective-C 前端(LLVM 编译器基础设施的一部分)的版本说明,版本 20.0.0git。在这里,我们将详细描述 Clang 的状态,包括自上一个版本以来的主要改进和新功能工作。有关通用 LLVM 版本说明,请参见 LLVM 文档。有关 libc++ 版本说明,请参见 此页面。所有 LLVM 版本都可从 LLVM 版本网站 下载。
潜在的破坏性变更¶
这些变更可能是升级到 Clang 20.0.0git 时会让用户感到意外的变更,因为它们可能会对现有代码库造成破坏。
已删除
le32
和le64
目标。clang -m32
现在在 SPARC Linux 上默认使用-mcpu=v9
。仍然支持 SPARC V8 CPU 的发行版需要在 配置文件 中指定-mcpu=v8
。已删除
clang-rename
工具。已删除对 RenderScript 目标的支持。该技术已 正式弃用,鼓励用户 迁移到 Vulkan 或其他选项。
C/C++ 语言潜在的破坏性变更¶
C++ 特定的潜在破坏性变更¶
已删除类型特征内置函数
__is_nullptr
,因为它几乎没有用户,并且可以写成__is_same(__remove_cv(T), decltype(nullptr))
,GCC 也支持。Clang 现在将正确地诊断在没有固定底层类型的枚举中将常量表达式设置为超出枚举值范围的值的情况,并将此情况诊断为非法的。
enum E { Zero, One, Two, Three, Four }; constexpr E Val1 = (E)3; // Ok constexpr E Val2 = (E)7; // Ok constexpr E Val3 = (E)8; // Now ill-formed, out of the range [0, 7] constexpr E Val4 = (E)-1; // Now ill-formed, out of the range [0, 7]
自 Clang 16 以来,可以通过 -Wno-enum-constexpr-conversion 来抑制诊断,以便为用户提供过渡时间。现在,在 Clang 20 中,**不再可以抑制该诊断**。
多余的模板头现在默认为非法的。可以使用
-Wno-error=extraneous-template-head
禁用此错误。template <> // error: extraneous template head template <typename T> void f();
在常量求值期间,对同一字符串字面量的不同求值的比较现在将被正确地视为非常量,而对不可能在内存中重叠的字符串字面量的比较现在将被视为常量。这会更新 Clang 以匹配开放核心问题 CWG2765 <http://wg21.link/CWG2765> 的预期方向,但在该问题解决之前可能会发生变化。
constexpr const char *f() { return "hello"; } constexpr const char *g() { return "world"; } // Used to evaluate to false, now error: non-constant comparison. constexpr bool a = f() == f(); // Might evaluate to true or false, as before. bool at_runtime() { return f() == f(); } // Was error, now evaluates to false. constexpr bool b = f() == g();
Clang 现在将正确地不将指向非类的指针考虑为协变,并将禁止将返回类型更改为没有相同或更少 cv 限定符的类型。
struct A { virtual const int *f() const; virtual const std::string *g() const; }; struct B : A { // Return type has less cv-qualification but doesn't point to a class. // Error will be generated. int *f() const override; // Return type doesn't have more cv-qualification also not the same or // less cv-qualification. // Error will be generated. volatile std::string *g() const override; };
警告
-Wdeprecated-literal-operator
现在默认情况下处于启用状态,因为 WG21 表现出对其从语言中删除的兴趣。结果是,任何使用-Werror
编译的人都会看到此诊断。要修复此诊断,只需从operator""
和用户定义的字面量名称之间删除空格,这样源代码就不再被弃用。这与 CWG2521 <https://cplusplus.github.io/CWG/issues/2521.html>_ 一致。// Now diagnoses by default. unsigned operator"" _udl_name(unsigned long long); // Fixed version: unsigned operator""_udl_name(unsigned long long);
当 [[clang::lifetimebound]] 应用于返回 void 的函数的参数时,Clang 现在会生成错误诊断。以前这会被忽略并且没有效果。(#107556)
// Now diagnoses with an error. void f(int& i [[clang::lifetimebound]]);
此版本中的 ABI 变更¶
修复了 MSVC 1920+ 中占位符、自动和 decltype(auto) 返回类型的 Microsoft 命名约定。此更改解决了与 MSVC 1920+ 编译的代码的不兼容性,但会导致与早期版本的 Clang 编译的代码不兼容,除非此类代码使用编译器选项 -fms-compatibility-version=19.14 构建以模仿 MSVC 1914 命名约定行为。
修复了 Itanium 对构造虚表名称的命名约定。此更改会导致与 Clang 19 及更早版本编译的代码不兼容,除非使用 -fclang-abi-compat=19 选项。(#108015)
AST 导出潜在的破坏性变更¶
Clang 前端潜在的破坏性变更¶
Clang Python 绑定潜在的破坏性变更¶
Clang 20.0.0git 中的新功能¶
这里列出了一些 Clang 的主要新功能和改进。首先描述了对 Clang 整体或其底层基础设施的一般改进,然后是特定于语言的部分,其中描述了对 Clang 对这些语言的支持的改进。
C++ 语言变更¶
允许 GCC 向量/ext_vector_type 对象的单元素访问成为常量表达式。支持 V.xyzw 语法和其他在 OpenCL 中看到的一些内容。选择多个元素留作将来的工作。
实现 CWG1815。支持使用默认成员初始化器进行聚合初始化创建的临时对象的生存期延长。
在 C++11 中接受 C++26 用户定义的
static_assert
消息作为扩展。为仅限整数类型的整数类型添加
__builtin_elementwise_popcount
内置函数。为仅限浮点类型的浮点类型添加
__builtin_elementwise_fmod
内置函数。为仅限浮点类型的浮点类型添加
__builtin_elementwise_minimum
和__builtin_elementwise_maximum
内置函数。已添加内置类型别名
__builtin_common_type
以提高std::common_type
的性能。
C++2c 功能支持¶
添加
__builtin_is_implicit_lifetime
内置函数,它支持 P2647R1 隐式生存期类型的特征添加
__builtin_is_virtual_base_of
内置函数,它支持 P2985R0 检测虚拟基类的类型特征已实现 P2893R3 可变参数友元
添加了
__builtin_is_within_lifetime
内置函数,它支持 P2641R4 检查联合备选方案是否处于活动状态
C++23 功能支持¶
在 C++23 模式下删除了对 constexpr 函数中字面量类型的限制。
为 P2718R0 扩展 mem-default-init 中临时对象的生存期。Clang 现在完全支持 P2718R0 基于范围的 for 循环中的生存期延长。
C++20 功能支持¶
对 C++ 缺陷报告的解决¶
允许从包含相同类型单个元素的初始化列表调用初始化列表构造函数,而不是始终进行复制。(CWG2137: 从相同类型的对象进行列表初始化 <https://cplusplus.github.io/CWG/issues/2137.html>)
针对 CWG2311 的推测性解决方案已实施,以便在实现 CWG2137 时不会删除之前已完成的保证复制省略的情况。对于类类型
T
的右值e
,T{e}
将尝试解析初始化列表构造函数,如果成功将使用它。否则,如果没有初始化列表构造函数,复制将像T(e)
一样被省略。(CWG2311: 遗漏的保证复制省略情况 <https://cplusplus.github.io/CWG/issues/2311.html>)从位域到整型类型的强制转换现在不再被视为缩窄转换,即使位域的类型更大,只要位域的宽度意味着所有潜在值都在目标类型的范围内。(CWG2627: 位域和缩窄转换)
nullptr
现在在传递给 C 样式可变参数函数时被提升为void*
。(CWG722: nullptr 能否传递给省略号?)允许
void{}
作为类型为void
的右值。(CWG2351: void{}).Clang 现在对 CWG2398 有了改进的解析,允许类模板在部分排序时具有推断的默认参数。
Clang 现在允许在常量表达式中比较已转换为
void *
的不相等的对象指针。这些比较在非常量表达式中始终有效。(CWG2749: 关系比较中“指向 void 的指针”的处理).拒绝具有
void
类型的显式对象参数 (this void
)。(CWG2915: 具有 void 类型的显式对象参数).Clang 现在允许在显式推导指南中使用尾部 requires 子句。(CWG2707: 推导指南不能具有尾部 requires 子句).
Clang 现在默认情况下会诊断
literal-operator-id
的第一个产生式中的空格。(CWG2521: 用户定义的文字和保留标识符).
C 语言变更¶
C2y 特性支持¶
C23 特性支持¶
Clang 现在支持 N3029 改进的普通枚举。
此版本中的非详尽变更列表¶
浮点比较内置函数 (
__builtin_isgreater
、__builtin_isgreaterequal
、__builtin_isless
等) 和__builtin_signbit
现在可以在常量表达式中使用。插件现在可以定义适用于语句和声明的自定义属性。
__builtin_abs
函数现在可以在常量表达式中使用。
新的编译器标志¶
添加了
-fc++-static-destructors={all,thread-local,none}
标志来控制哪些 C++ 变量注册静态析构函数:all(默认)为所有变量注册,thread-local 仅为线程局部变量注册,none(对应于现有的-fno-c++-static-destructors
标志)跳过所有静态析构函数注册。
已弃用的编译器标志¶
-fheinous-gnu-extensions
已弃用;它现在等效于指定-Wno-error=invalid-gnu-asm-cast
,将来可能会被删除。
修改后的编译器标志¶
-ffp-model
选项已更新,以便在使用fast
参数时启用更有限的优化,并接受一个新的参数aggressive
。-ffp-model=aggressive
的行为等效于-ffp-model=fast
的先前行为。更新的-ffp-model=fast
行为不再假设仅限有限数学,并且在可能的情况下使用promoted
算法进行复数除法,而不是使用更基本的(有限范围)算法。-fveclib
选项已更新,以便为-fveclib=ArmPL
和-fveclib=SLEEF
启用-fno-math-errno
。这为 Clang 提供了更多机会利用这些向量库。所有其他向量函数库的行为保持不变。-Wnontrivial-memaccess
警告已更新,现在还将警告将非平凡可复制的目的地参数传递给memcpy
、memset
和类似函数,对于这些函数,它是已记录的未定义行为。
已删除的编译器标志¶
编译器标志 -Wenum-constexpr-conversion(以及 Wno-、Wno-error- 派生)现在已删除,因为它不再能够抑制诊断(见上文)。如果用户仍在使用它,则可以预期看到 未知警告 诊断。
Clang 中的属性变更¶a
swift_attr
现在可以应用于类型。为了使在 Swift 中安全地使用导入的 API 成为可能,必须有一种方法来使用相关的属性注释单个参数和结果类型,这些属性指示例如块是在特定 actor 上调用的,或者它接受 Sendable 或全局 actor(即@MainActor
)隔离参数。例如
@interface MyService -(void) handle: (void (^ __attribute__((swift_attr("@Sendable"))))(id)) handler; @end
Clang 现在不允许在同一个函数上附加多个
__attribute__((ownership_returns(class, idx)))
,它们具有不同的类名。从 OpenBSD 引入了一个新的格式属性
__attribute__((format(syslog, 1, 2)))
。hybrid_patchable
属性现在在 ARM64EC 目标上受支持。它可以用来指定一个函数需要一个额外的 x86-64 thunk,该 thunk 可能在运行时被修补。[[clang::lifetimebound]]
现在在显式对象成员函数上明确禁止使用,它们之前在那里被静默忽略。Clang 现在会自动将
[[clang::lifetimebound]]
添加到std::span, std::string_view
构造函数的参数中,这使得 Clang 能够捕获更多返回的引用比对象存活时间更长的案例。(#100567)Clang 现在会正确诊断在 C++ 中使用
btf_type_tag
并忽略它;此属性是一个 C 语言专用属性,并且在某些情况下会因在 C++ 中意外允许使用它而导致模板实例化时发生崩溃。(#106864)引入了一个新的属性
[[clang::coro_await_elidable]]
用于协程返回类型,以在协程在安全省略上下文中调用时表达在调用点处的省略能力。引入了一个新的属性
[[clang::coro_await_elidable_argument]]
用于函数参数,如果该函数也处于安全省略上下文中,则将安全省略上下文传播到参数。[[clang::musttail]]
属性的文档已更新,以说明所有局部变量的生命周期都在调用之前结束。这不会改变编译器的行为,因为这在以前的版本中是正确的。修复了 clang 不会自动将
[[gsl::Owner]]
或[[gsl::Pointer]]
应用于 STL 显式模板特化声明的错误。(#109442)
Clang 诊断的改进¶
一些与模板相关的诊断已得到改进。
void foo() { template <typename> int i; } // error: templates can only be declared in namespace or class scope struct S { template <typename> int i; // error: non-static data member 'i' cannot be declared as a template };
Clang 现在对具有显式 'this' 参数的函数具有改进的诊断。修复了 #97878
Clang 现在会诊断对临时对象的字段的悬空引用。修复了 #81589.
Clang 现在更一致地诊断常量表达式中的未定义行为。这包括无效的移位以及算术运算中的有符号溢出。
-Wdangling-assignment-gsl 已默认启用。
Clang 现在始终保留用于专门化模板类型别名的模板参数的书写形式。
Clang 现在会诊断在
extern
上下文中使用main
作为无效,因为这违反了 [basic.start.main] p3 的规定。修复了 #101512.Clang 现在会在 C 语言中将 [[nodiscard]] 函数的结果在被强制转换后丢弃时进行诊断。修复了 #104391.
不要发出重复的悬空诊断。(#93386).
尝试将概念设为友元时的改进诊断。(#45182).
添加了
-Winvalid-gnu-asm-cast
诊断组来控制针对左值的“noop”转换使用情况的警告(GNU 扩展)。此诊断是一个警告,默认情况下为错误,默认情况下启用,也由现在已弃用的-fheinous-gnu-extensions
标志控制。添加了
-Wdecls-in-multiple-modules
选项,帮助用户识别不同模块中的多个声明,这是模块编译速度慢的主要原因。此警告默认情况下已禁用,需要显式启用或通过-Weverything
启用。改进了在
extern "C"
上下文中尝试重载函数时的诊断。(#80235)Clang 现在为赋值运算符参数尊重 lifetimebound 属性。(#106372).
Clang 中的 lifetimebound 和 GSL 分析是连贯的,允许 Clang 检测更多使用后释放错误。(#100549).
Clang 现在诊断从容器内的 gsl-owner 对象构造 gsl-pointer 的悬空情况 (#100384).
Clang 现在使用
-Wpre-c23-compat
而不是-Wpre-c++17-compat
对 C23 中使用的 u8 字符字面量进行警告。Clang 现在诊断在模块接口单元中导入模块实现分区单元时的错误。
当
[[gsl::Owner]]
和 [[clang::lifetimebound]] 一起使用时,不要发出虚假的悬空诊断 (#108272).现在,
-Wreturn-stack-address
警告还针对使用[[clang::musttail]]
属性传递给函数调用的局部变量的地址发出警告。Clang 现在诊断构造悬空
GSLOwner<GSLPointer>
对象的情况,例如std::vector<string_view> v = {std::string()};
(#100526).Clang 现在诊断
requires
表达式具有 void 类型的局部参数时,与函数参数对齐 (#109831).当方法定义与任何声明不匹配时,Clang 现在在类声明处发出诊断提示 (#110638).
Clang 现在忽略带有单个展开的折叠表达式中多余括号的警告 (#101863).
现在,针对命名寄存器变量的类型不受支持的警告措辞为
unsupported type for named register variable
,而不是bad type for named register variable
。这清楚地表明该类型根本不受支持,而不是在某种程度上,错误没有提到该类型是次优的 (#111550).Clang 现在发出
-Wdepredcated-literal-operator
诊断,即使名称是保留名称,我们也错误地允许它抑制诊断。Clang 现在诊断局部变量上的
[[deprecated]]
属性用法 (#90073).
Clang 时间跟踪的改进¶
覆盖映射的改进¶
此版本中的错误修复¶
修复了
<stdatomic.h>
中ATOMIC_FLAG_INIT
的定义,以便它可以在 C++ 中使用。修复了在 C 上下文中检查所需的字面量类型时发生的断言失败。(#101304).
修复了尝试转换依赖地址空间类型时的崩溃。修复了 #101685。
修复了在诊断格式字符串并遇到空定界转义序列(例如
"\o{}"
)时的崩溃。 #102218修复了在 64 位目标上使用
__array_rank
时的崩溃。(#113044).针对不支持的寄存器变量类型发出的警告现在指向不支持的类型,而不是
register
关键字 (#109776).修复了为具有灵活数组初始化的全局变体发出 ctor 时的崩溃 (#113187).
修复了当 GNU 语句表达式包含无效语句时发生的崩溃 (#113468).
编译器内置函数的错误修复¶
属性支持的错误修复¶
C++ 支持的错误修复¶
修复了当具有依赖
__typeof__
类型的表达式用作一元运算符的操作数时发生的崩溃。(#97646)修复了 requires 表达式中初始化捕获引用的错误打包展开。
修复了在检查无效的 delete 运算符声明时发生的断言失败。(#96191)
修复了在检查具有无效初始化程序的析构函数引用时发生的崩溃。(#97230)
Clang 现在可以正确解析指针到成员声明符中可能声明性的嵌套名称说明符。
修复了在检查使用字符串字面量初始化的对象的初始化程序时发生的崩溃。(#82167)
修复了在将模板模板参数与具有不同类类型参数的模板匹配时发生的崩溃。(#101394)
Clang 现在可以正确识别概念中参数替换的正确上下文,因此它不会在这些情况下错误地抱怨缺少模块导入。(#60336)
修复了初始化捕获包在实例化之前的大小为 1 的问题。(#63677)
Clang 现在保留了用于打包展开的 lambda 转换中的未展开标志。(#56852), (#85667), (#99877).
修复了诊断受约束成员函数的不明确显式专门化时的错误。
修复了在从包含转换函数模板专门化的重载集中选择函数时发生的断言失败。
正确诊断在自己的定义中使用概念名称的尝试;概念名称在引入其范围时会更早,以匹配 C++ 标准。(#55875)
正确拒绝具有无效类型的默认关系运算符,用于显式对象参数,例如
bool operator==(this int, const Foo&)
(#100329),以及右值引用参数。正确拒绝具有非引用显式对象参数的默认复制/移动赋值运算符。
Clang 现在可以正确处理 extern 块中属性的顺序。(#101990).
通过防止空显式对象参数被推断,修复了断言失败。(#102025).
正确检查成员函数的显式实例化的约束。(#46029)
在执行函数模板的部分排序时,Clang 现在检查推断是否一致。修复了 (#18291).
修复了关于友元函数模板引用与友元函数模板相比具有更大模板深度的值的约束的断言失败。(#98258)
Clang 现在在所有情况下都会在当前实例化的上下文中重建内联声明和专门化的模板参数。
修复依赖包索引表达式/类型说明符的索引的评估 (#105900)
在存在隐式转换的情况下,正确处理直接调用的子表达式。(#105558)
Clang 现在可以正确处理从数组对结构化绑定的直接列表初始化。(#31813)
将推断类型的占位符作为模板前缀进行编码,以便模板模板参数的编码使用正确的生成。(#106182)
修复了在将向量转换为 int/float 时使用无效表达式发生的断言失败。(#105486)
在内联类模板专门化声明之前,模板参数名称被视为其声明上下文中的名称查找。(#64082)
修复了友元声明的约束比较错误。(#78101)
修复了将
_
作为 lambda 初始化捕获变量的名称的处理。(#107024)修复了空包索引类型替换中的错误。(#105903)。
Clang不再尝试捕获泛型 lambda 模板参数的非 ODR 使用的默认参数。(#107048)。
修复了默认比较运算符会从基类中删除
const
的错误。(#102588)。修复了在 lambda 表达式尾随返回类型中使用
source_location
时发生的崩溃。(#67134)。修复了在无效 CTAD 指南的拼写纠正中发生的崩溃。(#107887)。
修复了当静态断言声明具有无效的结束位置时发生的崩溃。(#108687)。
在某些
consteval
上下文中避免了冗余的友元声明实例化。(#107175)。修复了在调试模式下的断言失败,以及在发布模式下的潜在崩溃,这些崩溃是在诊断由于构造函数参数类型的隐式转换失败而导致的失败的强制转换时发生的。
通过调整整数到布尔向量转换修复了断言失败。(#108326)。
修复了推断引用类型非类型模板参数的问题。(#73460)。
修复了约束评估中的问题,其中包含外部未展开参数的 lambda 表达式上的类型约束没有正确展开。(#101754)。
修复了函数模板成员专门化导致的崩溃,并提高了显式实例化行为与 MSVC 的一致性。(#111266)。
修复了约束表达式比较中的错误,其中
sizeof...
表达式在某些友元声明中没有得到正确处理。(#93099)。Clang现在在跨模块合并 lambda 的类类型时实例化了正确的 lambda 调用运算符。(#110401)。
Clang现在在比较内联定义和针对给定类模板的隐式实例化的成员模板的显式专门化的约束时,使用正确的模板参数列表集。(#102320)。
修复了在解析涉及无效类型的伪析构函数时发生的崩溃。(#111460)。
Clang不再在 lambda 包含一个包含未展开参数包的无效块声明时发生崩溃。(#109148)。
修复了在显式成员函数中,具有顶层 cv 限定符的对象参数的重载处理。(#100394)。
修复了 lambda 捕获中的错误,其中
constexpr
类类型对象在某些情况下没有被正确地视为 ODR 使用。(#47400),(#90896)。修复了导致生成的代码中出现崩溃的错误的模板化数组大小计算。(#41441)。
在查找基类名称时,非类型名称将被忽略。(#16855)。
修复了在恢复涉及显式对象成员转换运算符的无效表达式时发生的崩溃。(#112559)。
Clang错误地认为具有匿名联合成员的类不是 const-default-constructible,即使联合成员具有默认成员初始化器。(#95854)。
修复了在评估数组初始化器中的无效表达式时发生的断言失败。(#112140)。
修复了针对条件抛出表达式的范围计算的断言失败。(#111854)。
Clang现在正确地忽略了针对隐式实例化的类模板专门化的成员模板的先前部分专门化。(#51051)。
修复了由无效枚举前向声明引起的断言失败。(#112208)。
AST 处理的错误修复¶
其他错误修复¶
修复的其他 Clang 崩溃¶
修复了 C 中由于错误的查找导致的崩溃,在嵌套的匿名结构/联合中,成员可以作为结构/联合定义中的普通标识符被找到。(#31295)。
修复了由
sizeof
和其他类似运算符的长链导致的崩溃,这些运算符后面可以跟一个非括号表达式。(#45061)。修复了在使用
-ffp-contract=fast-honor-pragmas
编译#pragma STDC FP_CONTRACT DEFAULT
时发生的崩溃。(#104830)。修复了当函数具有超过 65536 个参数时发生的崩溃。现在将发出诊断。(#35741)。
修复了在涉及
concept
的代码上使用-ast-dump-decl-types
运行-ast-dump
时发生的崩溃。(#94928)。修复了在通过 ADL 找到隐式全局模块中的声明时触发的内部断言。(GH#109879)。
OpenACC 特定更改¶
目标特定更改¶
Clang现在实现了 Solaris 特定的
std::tm
的符号修饰为tm
,std::div_t
、std::ldiv_t
和std::lconv
也是如此,以实现 Solaris ABI 兼容性。(#33114)。
AMDGPU 支持¶
X86 支持¶
来自
*mmintrin.h
的 MMX 向量内联函数,它们操作__m64向量,例如_mm_add_pi8
,已被重新实现以无条件地使用 SSE2 指令集和 XMM 寄存器。因此,如果启用 MMX 但没有启用 SSE2,则这些内联函数将不再受支持 - 无论是针对从 Pentium-MMX 到 Pentium 3 的 CPU,还是通过传递诸如-mmmx -mno-sse2
之类的参数明确启用。(MMX 汇编代码仍然受支持,无需 SSE2,包括在内联汇编中)。已删除以前实现上述 MMX 内联函数的编译器内置函数,例如
__builtin_ia32_paddb
。任何使用这些已删除函数的代码都应该迁移到*mmintrin.h
头文件中定义的函数。可以在clang/www/builtins.py
文件中找到映射。支持
AVX10.2
的 ISA。* 支持*_(mask(z)))_minmax(ne)_p[s|d|h|bh]
和*_(mask(z)))_minmax_s[s|d|h]
的 MINMAX 内联函数。支持
SM4 和 AVX10.2
的内联函数。* 支持_mm512_sm4key4_epi32
和_mm512_sm4rnds4_epi32
的 SM4 内联函数。现在可以在常量表达式中使用 adcintrin.h 中的所有内联函数。
现在可以在常量表达式中使用 adxintrin.h 中的所有内联函数。
现在可以在常量表达式中使用 lzcntintrin.h 中的所有内联函数。
现在可以在常量表达式中使用 bmiintrin.h 中的所有内联函数。
现在可以在常量表达式中使用 bmi2intrin.h 中的所有内联函数。
现在可以在常量表达式中使用 tbmintrin.h 中的所有内联函数。
支持
MOVRS 和 AVX10.2
的内联函数。* 支持_mm(256|512)_(mask(z))_loadrs_epi(8|16|32|64)
的内联函数。支持
AMX-FP8
的 ISA。支持
AMX-TRANSPOSE
的 ISA。
ARM 和 AArch64 支持¶
在 ARM 目标中,可以通过使用
-fno-omit-frame-pointer
选项保留叶函数的帧指针 (FP)。如果您想在启用-fno-omit-frame-pointer
后在叶函数中消除 FP,可以通过添加-momit-leaf-frame-pointer
选项来实现。
Android 支持¶
Windows 支持¶
clang-cl 现在支持
/std:c++23preview
,它启用了 C++23 功能。即使启用了 fms-extensions,Clang 在模拟 MSVC 1900+ 时也不再允许联合体中的引用。从 VS2015,MSVC 1900 开始,此 Microsoft 扩展不再允许,并且始终会导致错误。Clang 现在在此场景中遵循 MSVC 的行为。当命令行上设置了 -fms-compatibility-version=18.00 或更早版本时,此 Microsoft 扩展仍然允许,因为 VS2013 和更早版本允许它。
LoongArch 支持¶
RISC-V 支持¶
支持大型代码模型的选项
-mcmodel=large
。
CUDA/HIP 语言变更¶
CUDA 支持¶
Clang 现在支持 CUDA SDK 高达 12.6。
添加了对 sm_100 的支持。
AIX 支持¶
NetBSD 支持¶
WebAssembly 支持¶
默认目标 CPU “generic” 现在启用了 -mnontrapping-fptoint 和 -mbulk-memory 标志,它们对应于 [Bulk Memory Operations] 和 [Non-trapping float-to-int Conversions] 语言特性,这些特性是 [广泛在引擎中实现的]。
[Bulk Memory Operations]: https://github.com/WebAssembly/bulk-memory-operations/blob/master/proposals/bulk-memory-operations/Overview.md [Non-trapping float-to-int Conversions]: https://github.com/WebAssembly/spec/blob/master/proposals/nontrapping-float-to-int-conversion/Overview.md [广泛在引擎中实现的]: https://webassembly.net.cn/features/
AVR 支持¶
拒绝没有 SRAM 的 avr1 设备的 C/C++ 编译。
Clang 中的 DWARF 支持¶
Clang 中的浮点支持¶
为仅浮点类型添加
__builtin_elementwise_atan2
内建函数。
Clang 中的定点支持¶
AST 匹配器¶
clang-format¶
添加了
BreakBinaryOperations
选项。添加了
TemplateNames
选项。添加了
AlignFunctionDeclarations
选项到AlignConsecutiveDeclarations
中。添加了
IndentOnly
子选项到ReflowComments
中,以修复多行注释的缩进,而不会触及其内容,将false
重命名为Never
,将true
重命名为Always
。添加了
RemoveEmptyLinesInUnwrappedLines
选项。添加了
KeepFormFeed
选项,并将其设置为true
以用于GNU
样式。
libclang¶
添加
clang_isBeforeInTranslationUnit
。给定两个源位置,它确定第一个位置是否严格位于第二个位置之前。
静态分析器¶
新功能¶
崩溃和错误修复¶
改进¶
改进了对
ownership_returns
属性的处理。现在,如果属性附加到返回非指针值的函数,Clang 会报告错误。修复了 (#99501)
已迁移的检查器¶
检查器
alpha.security.MallocOverflow
已删除,因为它实现不当,并且其积极的逻辑产生了太多误报。要检测传递给 malloc 的过大参数,请考虑使用检查器alpha.taint.TaintedAlloc
。检查器
alpha.nondeterministic.PointerSorting
和alpha.nondeterministic.PointerIteration
已移至名为bugprone-nondeterministic-pointer-iteration-order
的新 bugprone 检查器中。原始检查器仅使用 AST 匹配实现,并且作为单个 clang-tidy 检查更有意义。
消毒剂¶
引入了实时消毒剂,通过使用 -fsanitize=realtime 标志激活。此消毒剂检测不安全的系统库调用,例如内存分配和互斥锁。如果在调用用
[[clang::nonblocking]]
属性标记的函数期间调用了任何此类函数,则会将错误打印到控制台,并且进程以非零值退出。添加了
-fsanitize-undefined-ignore-overflow-pattern
标志,它可用于禁用特定与溢出相关的代码模式。支持的模式为:add-signed-overflow-test
、add-unsigned-overflow-test
、negated-unsigned-const
和unsigned-post-decr-while
。可以通过指定all
来关闭所有可用模式的消毒剂检测。相反,您可以使用none
禁用所有排除项,这是默认值。/// specified with ``-fsanitize-undefined-ignore-overflow-pattern=add-unsigned-overflow-test`` int common_overflow_check_pattern(unsigned base, unsigned offset) { if (base + offset < base) { /* ... */ } // The pattern of `a + b < a`, and other re-orderings, won't be instrumented } /// specified with ``-fsanitize-undefined-ignore-overflow-pattern=add-signed-overflow-test`` int common_overflow_check_pattern_signed(signed int base, signed int offset) { if (base + offset < base) { /* ... */ } // The pattern of `a + b < a`, and other re-orderings, won't be instrumented } /// specified with ``-fsanitize-undefined-ignore-overflow-pattern=negated-unsigned-const`` void negation_overflow() { unsigned long foo = -1UL; // No longer causes a negation overflow warning unsigned long bar = -2UL; // and so on... } /// specified with ``-fsanitize-undefined-ignore-overflow-pattern=unsigned-post-decr-while`` void while_post_decrement() { unsigned char count = 16; while (count--) { /* ... */ } // No longer causes unsigned-integer-overflow sanitizer to trip }
许多现有项目中存在大量这些代码模式。此新标志应允许这些项目在减少噪声的情况下启用整数消毒剂。
Python 绑定变更¶
修复了在调用
Type.get_exception_specification_kind
时导致崩溃的问题。
OpenMP 支持¶
添加了对 ‘omp assume’ 指令的支持。
添加了对 ‘omp scope’ 指令的支持。
改进¶
改进了对包含使用用户定义的映射器嵌套的结构体的结构体映射数组部分的处理。
num_teams 和 thead_limit 现在在
target teams ompx_bare
结构中一起使用时接受多个表达式。这允许目标区域在 GPU 上以多维网格启动。
其他信息¶
在 Clang 网页 上提供了大量其他信息。该网页包含与源代码的 Git 版本同步的 API 文档版本。您可以通过进入 Clang 树中的 “clang/docs/
” 目录访问特定于此版本的这些文档版本。
如果您对 Clang 有任何问题或意见,请随时在 Discourse 论坛(Clang 前端类别) 上与我们联系。