Flexible array member added, zero sized structs removed.

This commit is contained in:
Christoffer Lerno
2021-12-14 18:53:23 +01:00
parent 5ddbf50e83
commit 680b077eb1
30 changed files with 252 additions and 35 deletions

View File

@@ -0,0 +1,31 @@
struct Foo
{
int x;
int[*] y; // #error: flexible array member must be the last element
int z;
}
struct Bar
{
int[*] y; // #error: flexible array member cannot be the only element
}
struct Baz
{
int y;
int[*] z;
}
struct BazContainerOk
{
int z;
Baz c;
}
struct BazContainer
{
Baz c; // #error: A struct member with a flexible array must be the last element.
int y;
}
Baz[5] ab; // #error: Arrays of structs with flexible array members is not allowed.

View File

@@ -0,0 +1,35 @@
// #target: x64-darwin
module foo;
struct Bar
{
struct
{
int y;
}
int ufe;
int[*] z;
}
fn void test(Bar b)
{
b.z[1];
}
/* #expect: foo.ll
%Bar = type { %anon, i32, [0 x i32] }
%anon = type { i32 }
define void @foo.test(%Bar* byval(%Bar) align 8 %0) #0 {
entry:
%b = alloca %Bar, align 4
%1 = bitcast %Bar* %b to i8*
%2 = bitcast %Bar* %0 to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 8 %2, i32 8, i1 false)
%3 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 2
%4 = getelementptr inbounds [0 x i32], [0 x i32]* %3, i64 0, i64 1
%5 = load i32, i32* %4, align 4
ret void
}

View File

@@ -0,0 +1,7 @@
define Foo = int[0];
struct Bar
{
Foo x; // #error: Zero length arrays are not valid members.
int b;
}