Clang 20.0.0git (开发中) 版本说明

LLVM 团队 编写

警告

这些是即将发布的 Clang 20 版本的开发中说明。以前版本的版本说明可在 发布页面 上找到。

简介

本文档包含 Clang C/C++/Objective-C 前端(LLVM 编译器基础设施的一部分)的版本说明,版本 20.0.0git。在这里,我们将详细描述 Clang 的状态,包括自上一个版本以来的主要改进和新功能工作。有关通用 LLVM 版本说明,请参见 LLVM 文档。有关 libc++ 版本说明,请参见 此页面。所有 LLVM 版本都可从 LLVM 版本网站 下载。

有关 Clang 或 LLVM 的更多信息,包括有关最新版本的详细信息,请参见 Clang 网站LLVM 网站

潜在的破坏性变更

这些变更可能是升级到 Clang 20.0.0git 时会让用户感到意外的变更,因为它们可能会对现有代码库造成破坏。

  • 已删除 le32le64 目标。

  • 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)

  • 将类似成员的友元函数模板作为封闭类的成员进行命名。(#110247, #110503)

AST 导出潜在的破坏性变更

Clang 前端潜在的破坏性变更

Clang Python 绑定潜在的破坏性变更

  • 部分返回字符串结果的接口现在将在没有结果可用时返回空字符串 "",而不是 None

  • CompletionChunkCompletionString 类上静态地调用属性现在会导致错误,而不是返回一个在内部使用的 CachedProperty 对象。属性仅在实例上可用。

  • 对于单行 SourceRange 和同一行中但位于 SourceRange 结束位置之后的 SourceLocationSourceRange.__contains__ 以前会错误地返回 True。(#22617), (#52827)

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 功能支持

C++23 功能支持

C++20 功能支持

对 C++ 缺陷报告的解决

  • 允许从包含相同类型单个元素的初始化列表调用初始化列表构造函数,而不是始终进行复制。(CWG2137: 从相同类型的对象进行列表初始化 <https://cplusplus.github.io/CWG/issues/2137.html>)

  • 针对 CWG2311 的推测性解决方案已实施,以便在实现 CWG2137 时不会删除之前已完成的保证复制省略的情况。对于类类型 T 的右值 eT{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 警告已更新,现在还将警告将非平凡可复制的目的地参数传递给 memcpymemset 和类似函数,对于这些函数,它是已记录的未定义行为。

已删除的编译器标志

  • 编译器标志 -Wenum-constexpr-conversion(以及 Wno-Wno-error- 派生)现在已删除,因为它不再能够抑制诊断(见上文)。如果用户仍在使用它,则可以预期看到 未知警告 诊断。

Clang 中的属性变更¶a

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).

编译器内置函数的错误修复

  • 修复了当原子内置函数使用指向零大小结构的指针调用时发生的崩溃 (#90330)

  • Clang 现在允许原子内置函数参数的被指向类型是未在其他地方实例化的完整模板类型。

  • __noop 现在可以在常量表达式中使用。(#102064)

  • 修复了 __has_builtin 错误地为某些 C++ 类型特征返回 false 的问题。(#111477)

属性支持的错误修复

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)

  • 修复了依赖源位置表达式的问题(#106428),(#81155),(#80210),(#85373)。

  • 修复了空包索引类型替换中的错误。(#105903)。

  • Clang不再尝试捕获泛型 lambda 模板参数的非 ODR 使用的默认参数。(#107048)。

  • 修复了默认比较运算符会从基类中删除const的错误。(#102588)。

  • 修复了在 lambda 表达式尾随返回类型中使用source_location时发生的崩溃。(#67134)。

  • 为(#61460)添加了一个后续修复程序,因为之前的修复程序并不完全正确。(#86361),(#112352)。

  • 修复了在无效 CTAD 指南的拼写纠正中发生的崩溃。(#107887)。

  • 修复了当 clang 尝试在保留参数包的同时替换参数包时发生的崩溃。(#63819),(#107560)。

  • 修复了当静态断言声明具有无效的结束位置时发生的崩溃。(#108687)。

  • 在某些consteval上下文中避免了冗余的友元声明实例化。(#107175)。

  • 修复了在调试模式下的断言失败,以及在发布模式下的潜在崩溃,这些崩溃是在诊断由于构造函数参数类型的隐式转换失败而导致的失败的强制转换时发生的。

  • 通过调整整数到布尔向量转换修复了断言失败。(#108326)。

  • 修复了推断引用类型非类型模板参数的问题。(#73460)。

  • 修复了约束评估中的问题,其中包含外部未展开参数的 lambda 表达式上的类型约束没有正确展开。(#101754)。

  • 修复了函数模板成员专门化导致的崩溃,并提高了显式实例化行为与 MSVC 的一致性。(#111266)。

  • 修复了约束表达式比较中的错误,其中sizeof...表达式在某些友元声明中没有得到正确处理。(#93099)。

  • Clang现在在跨模块合并 lambda 的类类型时实例化了正确的 lambda 调用运算符。(#110401)。

  • Clang现在在比较内联定义和针对给定类模板的隐式实例化的成员模板的显式专门化的约束时,使用正确的模板参数列表集。(#102320)。

  • 修复了在解析涉及无效类型的伪析构函数时发生的崩溃。(#111460)。

  • 修复了在使用显式属性和未声明的模板调用恢复调用表达式时发生的断言失败。(#107047),(#49093)。

  • Clang不再在 lambda 包含一个包含未展开参数包的无效块声明时发生崩溃。(#109148)。

  • 修复了在显式成员函数中,具有顶层 cv 限定符的对象参数的重载处理。(#100394)。

  • 修复了 lambda 捕获中的错误,其中constexpr类类型对象在某些情况下没有被正确地视为 ODR 使用。(#47400),(#90896)。

  • 修复了导致生成的代码中出现崩溃的错误的模板化数组大小计算。(#41441)。

  • 在查找基类名称时,非类型名称将被忽略。(#16855)。

  • 修复了在恢复涉及显式对象成员转换运算符的无效表达式时发生的崩溃。(#112559)。

  • Clang错误地认为具有匿名联合成员的类不是 const-default-constructible,即使联合成员具有默认成员初始化器。(#95854)。

  • 修复了在评估数组初始化器中的无效表达式时发生的断言失败。(#112140)。

  • 修复了针对条件抛出表达式的范围计算的断言失败。(#111854)。

  • Clang现在正确地忽略了针对隐式实例化的类模板专门化的成员模板的先前部分专门化。(#51051)。

  • 修复了由无效枚举前向声明引起的断言失败。(#112208)。

AST 处理的错误修复

  • 修复了在复杂整数除法中除以零时发生的崩溃。(#55390)。

  • 修复了ASTContext::getRawCommentForAnyRedecl()中的错误,该函数有时会错误地返回 null,即使存在注释。(#108145)。

其他错误修复

修复的其他 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的符号修饰为tmstd::div_tstd::ldiv_tstd::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 匹配器

  • 修复了 hasNamehasAnyName 匹配器在匹配具有相同名称的封闭命名空间的内联命名空间时出现的问题。

  • 修复了 hasOperands 匹配器在第一个匹配器中设置绑定并在第二个匹配器中使用它时发生的排序问题。

  • 修复了在遍历具有无效捕获的 lambda 表达式时发生的崩溃。(#106444)

  • 修复了 isInstantiatedisInTemplateInstantiation 以便也匹配变量模板。(#110666)

  • 确保 hasName 在内联命名空间中匹配模板特化,使 matchesNodeFullSlowmatchesNodeFullFast 一致。

clang-format

  • 添加了 BreakBinaryOperations 选项。

  • 添加了 TemplateNames 选项。

  • 添加了 AlignFunctionDeclarations 选项到 AlignConsecutiveDeclarations 中。

  • 添加了 IndentOnly 子选项到 ReflowComments 中,以修复多行注释的缩进,而不会触及其内容,将 false 重命名为 Never,将 true 重命名为 Always

  • 添加了 RemoveEmptyLinesInUnwrappedLines 选项。

  • 添加了 KeepFormFeed 选项,并将其设置为 true 以用于 GNU 样式。

libclang

  • 添加 clang_isBeforeInTranslationUnit。给定两个源位置,它确定第一个位置是否严格位于第二个位置之前。

静态分析器

新功能

  • 现在 CSA 对 __builtin_*_overflow 函数建模。(#102602)

  • MallocChecker 现在检查具有与“malloc”不同的类名的 ownership_returns(class, idx)ownership_takes(class, idx) 属性。如果分配和释放函数的类不匹配,Clang 静态分析器现在会报告错误。文档

  • 现在验证函数效果,例如 nonblockingnonallocating “性能约束” 属性。例如,对于声明了 nonblocking 属性的函数,编译器可以生成关于使用任何语言特性或调用其他可能阻塞的函数的警告。

崩溃和错误修复

改进

  • 改进了对 ownership_returns 属性的处理。现在,如果属性附加到返回非指针值的函数,Clang 会报告错误。修复了 (#99501)

已迁移的检查器

  • 检查器 alpha.security.MallocOverflow 已删除,因为它实现不当,并且其积极的逻辑产生了太多误报。要检测传递给 malloc 的过大参数,请考虑使用检查器 alpha.taint.TaintedAlloc

  • 检查器 alpha.nondeterministic.PointerSortingalpha.nondeterministic.PointerIteration 已移至名为 bugprone-nondeterministic-pointer-iteration-order 的新 bugprone 检查器中。原始检查器仅使用 AST 匹配实现,并且作为单个 clang-tidy 检查更有意义。

消毒剂

  • 引入了实时消毒剂,通过使用 -fsanitize=realtime 标志激活。此消毒剂检测不安全的系统库调用,例如内存分配和互斥锁。如果在调用用 [[clang::nonblocking]] 属性标记的函数期间调用了任何此类函数,则会将错误打印到控制台,并且进程以非零值退出。

  • 添加了 -fsanitize-undefined-ignore-overflow-pattern 标志,它可用于禁用特定与溢出相关的代码模式。支持的模式为:add-signed-overflow-testadd-unsigned-overflow-testnegated-unsigned-constunsigned-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_teamsthead_limit 现在在 target teams ompx_bare 结构中一起使用时接受多个表达式。这允许目标区域在 GPU 上以多维网格启动。

其他信息

Clang 网页 上提供了大量其他信息。该网页包含与源代码的 Git 版本同步的 API 文档版本。您可以通过进入 Clang 树中的 “clang/docs/” 目录访问特定于此版本的这些文档版本。

如果您对 Clang 有任何问题或意见,请随时在 Discourse 论坛(Clang 前端类别) 上与我们联系。