https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91278
Bug ID: 91278
Summary: Array arithmetic yields "is not a constant expression"
error
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: arthur.j.odwyer at gmail dot com
Target Milestone: ---
Bug 77911 might be related, I'm not sure.
// https://godbolt.org/z/UUb7kW
constexpr bool test() {
int i[2] {};
int j[2] {};
return i+0 == j+1;
}
constexpr bool x = test();
====
<source>:5:16: error: '(((int*)(& i)) == (((int*)(& j)) + 4))' is not a
constant expression
5 | return i+0 == j+1;
| ~~~~^~~~~~
====
There are two issues here. One is that the error shouldn't be happening at all;
it's totally cromulent to compare i+0 (i.e. &i[0]) with j+1 (i.e. &j[1]). `x`
should be initialized to `false`.
The other issue is cosmetic: this error is apparently happening very late in
the compiler, so that `j+1` (i.e. &j[1]) ends up getting pretty-printed as
`(((int*)(& j)) + 4))` (i.e. &j[4]). Seems like the compiler is remembering
SOME of the type information about `j` but not ALL of the type information.