On 14.06.23 14:59, Marc Mutz via Development wrote:
> A) new enums MUST have an explicit underlying type¹²

It's actually worse. In the 6.6 header review, several enums add 
enumerators that cross a power-of-two boundary, one even crosses 2⁸.

The C++ standard give compilers a lot of leeway in picking the 
underlying type of an unscoped enum with no explicit underlying type: 
https://eel.is/c++draft/dcl.enum#7

I would propose, therefore, two following, additional rule:

A2) any existing enum that gets extended MUST have a fixed³ underlying type

If it doesn't, then the commit that extends the enum MUST be prefixed by 
two other commits:
1. a commit adding a
        static_assert(std::is_same_v<
                std::underlying_type_t<Enum>,
                ExpectedType>
            );
    in the header file defining `Enum`. This patch MUST be picked into
    the last LTS
2. if (1) has been successfully integrated into dev and the last LTS, a
    commit that reverts the static_assert and fixes the enum's underlying
    type. This patch MUST NOT be picked to an older branch.

After these have landed, the enum can be safely extended.

Rationale: the first patch being in the LTS branch alerts us if any 
tool-chain disagrees with our expected underlying type. If at any later 
time, we get a bug-report saying that the static_assert triggered, we 
know we have to adjust the underlying type. The second patch fixes the 
assumption, forcing the compiler to alert us if a newly-added enumerator 
cannot be represented in the given underlying type.

³ a scoped enum has a fixed underlying type: int

Thanks,
Marc

-- 
Marc Mutz <marc.m...@qt.io>
Principal Software Engineer

The Qt Company
Erich-Thilo-Str. 10 12489
Berlin, Germany
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen
Sitz der Gesellschaft: Berlin,
Registergericht: Amtsgericht Charlottenburg,
HRB 144331 B

-- 
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to