[Bug c++/69638] New: array out of bounds access accepted in constexpr function invocation
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Feb 2 19:12:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69638
Bug ID: 69638
Summary: array out of bounds access accepted in constexpr
function invocation
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
GCC silently accepts the following invalid definitions and invocations of the
constexpr functions. I believe the program is invalid/ill-formed (and requires
a diagnostic) because the constexpr functions would have undefined behavior and
thus do not produce core constant expressions.
The same functions are rejected as expected when A is replaced with int.
(Clang rejects them either way.)
$ cat t.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -S -Wall -Wextra
-Wpedantic -std=c++14 -xc++ t.c
struct A {
constexpr A (int = 0) { }
constexpr operator int () const { return 0; }
};
constexpr int foo () {
A a [3] = { 1, 2, 3 };
return a [99];
}
struct B { unsigned b: foo () + 1; };
#if __GNUG__ > 5
// GCC 5 fails on this because of either 69509 or 69516
constexpr int bar (int n) {
A a [n] = { 1, 2, 3 };
return a [99];
}
struct C {
unsigned c: bar (1) + 1;
};
#endif
t.c: In function ‘constexpr int bar(int)’:
t.c:16:9: warning: ISO C++ forbids variable length array ‘a’ [-Wvla]
A a [n] = { 1, 2, 3 };
^
$
More information about the Gcc-bugs
mailing list