Skip to content

Clang should warn for implementation-defined constant expressions #64635

Open
@Eisenwave

Description

@Eisenwave

The following code doesn't compile for all major compilers, but receives no warnings from -Wall -Wpedantic -Wextra:

const float x = 0;
const float y = x;

This code isn't portable, even with the C23 relaxations. GCC and clang allow it, but MSVC rejects it. It is technically legal C, but the portability issues at least deserve a warning.

Relevant Wording

More latitude is permitted for constant expressions in initializers. Such a constant expression shall
be, or evaluate to, one of the following:

  • a named constant,
  • a compound literal constant,
  • an arithmetic constant expression,
  • a null pointer constant,
  • an address constant, or
  • an address constant for a complete object type plus or minus an integer constant expression

- 6.6 Constant expressions p9

For the initialization of y, obviously only the first and third bullets can apply. Arithmetic constant expressions are built on top of named constants, so the only question is whether x is a named constant.

An identifier that is:

  • an enumeration constant,
  • a predefined constant, or
  • declared with storage-class specifier constexpr and has an object type,

is a named constant, as is [...]

- 6.6 Constant expressions p7

x is not a named constant, because it is not constexpr. However, this code is not ill-formed, merely implementation-defined:

An implementation may accept other forms of constant expressions; however, they are not an integer constant expression.

- 6.6 Constant expressions p14

Suggested Solution

Clang should issue a warning, along the lines of:

initialization of 'y' relies on implementation-defined constant expressions [-Wnon-portable-constexpr]

Metadata

Metadata

Assignees

No one assigned

    Labels

    cc++clang:diagnosticsNew/improved warning or error message in Clang, but not in clang-tidy or static analyzerenhancementImproving things as opposed to bug fixing, e.g. new or missing featurequality-of-implementation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions