https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90947
Bug ID: 90947
Summary: Simple lookup table of array of strings is miscompiled
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: maister at archlinux dot us
Target Milestone: ---
On GCC 9.1.0, this snippet is miscompiled:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
static const char *vector_swizzle(int vecsize, int index)
{
static const char *swizzle[4][4] = {
{ ".x", ".y", ".z", ".w" },
{ ".xy", ".yz", ".zw", nullptr },
{ ".xyz", ".yzw", nullptr, nullptr },
{ "", nullptr, nullptr, nullptr },
};
assert(vecsize >= 1 && vecsize <= 4);
assert(index >= 0 && index < 4);
assert(swizzle[vecsize - 1][index]);
return swizzle[vecsize - 1][index];
}
int main(int argc, char **argv)
{
puts(vector_swizzle(atoi(argv[1]), atoi(argv[2])));
}
Compiled with "g++ -o test test.cpp", and ran with ./test 4 0, and it asserts.
The last array entry of swizzle[3] are all nullptr for some reason. No other
compiler behaves like this.