compile error for C pointer with align attribute

See #1059
This commit is contained in:
Andrew Kelley 2019-02-14 19:53:46 -05:00
parent 973a93d43b
commit cc7060d0d9
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
3 changed files with 15 additions and 6 deletions

View File

@ -5057,6 +5057,11 @@ static IrInstruction *ir_gen_pointer_type(IrBuilder *irb, Scope *scope, AstNode
IrInstruction *align_value; IrInstruction *align_value;
if (align_expr != nullptr) { if (align_expr != nullptr) {
if (ptr_len == PtrLenC) {
exec_add_error_node(irb->codegen, irb->exec, node,
buf_sprintf("[*c] pointers may not have align attribute"));
return irb->codegen->invalid_instruction;
}
align_value = ir_gen_node(irb, align_expr, scope); align_value = ir_gen_node(irb, align_expr, scope);
if (align_value == irb->codegen->invalid_instruction) if (align_value == irb->codegen->invalid_instruction)
return align_value; return align_value;

View File

@ -118,13 +118,17 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
); );
cases.addTest( cases.addTest(
"C pointer pointing to non C ABI compatible type", "C pointer pointing to non C ABI compatible type or has align attr",
\\const Foo = struct {}; \\const Foo = struct {};
\\export fn entry() [*c]Foo { \\export fn a() void {
\\ return undefined; \\ const T = [*c]Foo;
\\}
\\export fn b() void {
\\ const T = [*c]align(4) u8;
\\} \\}
, ,
".tmp_source.zig:2:19: error: C pointers cannot point to non-C-ABI-compatible type 'Foo'", ".tmp_source.zig:3:15: error: C pointers cannot point to non-C-ABI-compatible type 'Foo'",
".tmp_source.zig:6:15: error: [*c] pointers may not have align attribute",
); );
cases.addTest( cases.addTest(

View File

@ -67,12 +67,12 @@ test "type info: C pointer type info" {
} }
fn testCPtr() void { fn testCPtr() void {
const ptr_info = @typeInfo([*c]align(4) const i8); const ptr_info = @typeInfo([*c]const i8);
expect(TypeId(ptr_info) == TypeId.Pointer); expect(TypeId(ptr_info) == TypeId.Pointer);
expect(ptr_info.Pointer.size == TypeInfo.Pointer.Size.C); expect(ptr_info.Pointer.size == TypeInfo.Pointer.Size.C);
expect(ptr_info.Pointer.is_const); expect(ptr_info.Pointer.is_const);
expect(!ptr_info.Pointer.is_volatile); expect(!ptr_info.Pointer.is_volatile);
expect(ptr_info.Pointer.alignment == 4); expect(ptr_info.Pointer.alignment == 1);
expect(ptr_info.Pointer.child == i8); expect(ptr_info.Pointer.child == i8);
} }