llvm/llvm-project

[clang-tidy] New check for static_cast of an enum class type

Open

#71,543 创建于 2023年11月7日

在 GitHub 查看
 (13 评论) (0 反应) (1 负责人)C++ (10,782 fork)batch import
check-requestclang-tidygood first issue

仓库指标

Star
 (26,378 star)
PR 合并指标
 (平均合并 1天 2小时) (30 天内合并 1,000 个 PR)

描述

When casting an enum class type using static_cast<T>, this may result in a bug if the type T is not correct. In c++23 we have std::to_underlying which should be used instead. This also is more desirable because if the enum's underlying type is changed later, the casting code is automatically still correct without the need to make the change there, too.

// Fix, must add, if not already present:
#include <utility> // Provides std::to_underlying()


// NOLINTNEXTLINE(performance-enum-size)
enum class EType : int {};

auto main() -> int
{
    // NOLINTNEXTLINE(readability-magic-numbers)
    EType e {42};

    [[maybe_unused]]
    // c++23 and later only

    // Original code:
    // auto i = static_cast<int>(e);
    //          ~~~~~~~~~~~~~~~~
    //          ^ bugprone: use std::to_underlying
    // Fix:
    auto i = std::to_underlying(e);
    return 0;
}

贡献者指南