llvm/llvm-project

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

Open

#141.797 aberto em 28 de mai. de 2025

Ver no GitHub
 (12 comments) (1 reaction) (0 assignees)C++ (10.782 forks)batch import
c++11c++14clang:frontenddiverges-from:gccgood first issue

Métricas do repositório

Stars
 (26.378 stars)
Métricas de merge de PR
 (Mesclagem média 1d 2h) (1.000 fundiu PRs em 30d)

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

Guia do colaborador