llvm/llvm-project

`[[gnu::weak]]` disables constant evaluation of constexpr variables in C++14

Open

#141 797 ouverte le 28 mai 2025

Voir sur GitHub
 (12 commentaires) (1 réaction) (0 assignés)C++ (10 782 forks)batch import
c++11c++14clang:frontenddiverges-from:gccgood first issue

Métriques du dépôt

Stars
 (26 378 stars)
Métriques de merge PR
 (Merge moyen 1j 2h) (1 000 PRs mergées en 30 j)

Description

GCC and Clang disagree on their handling of [[gnu::weak]] before C++17 https://gcc.godbolt.org/z/s7q67vqjz

struct S { static constexpr int var = 0; };
[[gnu::weak]] constexpr int S::var;
static constexpr int usage = S::var;

While it would be unsafe to constant-fold this code, it should be fine to constant-evaluate it, for consistency with GCC

In static bool evaluateVarDeclInit (ExprConstant.cpp), and in static bool CheckWeak (Interp.cpp), we should allow constant evaluation -without diagnostics, but not constant folding) - by looking at Info.EvalMode

Guide contributeur