parent
973a93d43b
commit
cc7060d0d9
@ -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;
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user