https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87497
Bug ID: 87497
Summary: constexprs involving non-literal const variables are
incorrectly accepted
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rsandifo at gcc dot gnu.org
Target Milestone: ---
G++ accepts:
struct s { volatile int x; int y; };
constexpr int foo (const s &s1) { return s1.y; }
void g () { const s local_s = { 1, 2 }; constexpr int a = foo (local_s); }
even though "local_s" is only const, not constexpr (and couldn't be constexpr
due to having a non-literal type).
From Jonathan on IRC:
I think for foo(local_s) to be a constant expression, local_s needs to be a
constexpr variable, or a non-volatile const-qualified integer, or a reference
http://eel.is/c++draft/expr.const#8.7