llvm/llvm-project

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

开放

#141,797 创建于 2025年5月28日

 (12 条评论) (1 个反应) (0 位负责人)C++ (10,782 个派生)batch import
c++11c++14clang:frontenddiverges-from:gccgood first issue

仓库指标

星标
 (26,378 个星标)
PR 合并指标
 (PR 指标待抓取)

描述

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

贡献者指南