Catch more errors during the type resolution phase
Returning the uninitialized/stale error condition made the compiler turn a blind eye to some problems.master
parent
563d9ebfe5
commit
271fc6a247
|
@ -2180,7 +2180,7 @@ static Error resolve_struct_type(CodeGen *g, ZigType *struct_type) {
|
||||||
ZigType *field_type = resolve_struct_field_type(g, field);
|
ZigType *field_type = resolve_struct_field_type(g, field);
|
||||||
if (field_type == nullptr) {
|
if (field_type == nullptr) {
|
||||||
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
||||||
return err;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
if ((err = type_resolve(g, field->type_entry, ResolveStatusSizeKnown))) {
|
if ((err = type_resolve(g, field->type_entry, ResolveStatusSizeKnown))) {
|
||||||
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
||||||
|
@ -2270,7 +2270,7 @@ static Error resolve_struct_type(CodeGen *g, ZigType *struct_type) {
|
||||||
ZigType *field_type = resolve_struct_field_type(g, field);
|
ZigType *field_type = resolve_struct_field_type(g, field);
|
||||||
if (field_type == nullptr) {
|
if (field_type == nullptr) {
|
||||||
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
||||||
return err;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = type_resolve(g, field_type, ResolveStatusSizeKnown))) {
|
if ((err = type_resolve(g, field_type, ResolveStatusSizeKnown))) {
|
||||||
|
@ -2340,7 +2340,7 @@ static Error resolve_union_alignment(CodeGen *g, ZigType *union_type) {
|
||||||
&field->align))
|
&field->align))
|
||||||
{
|
{
|
||||||
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
||||||
return err;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
add_node_error(g, field->decl_node,
|
add_node_error(g, field->decl_node,
|
||||||
buf_create_from_str("TODO implement field alignment syntax for unions. https://github.com/ziglang/zig/issues/3125"));
|
buf_create_from_str("TODO implement field alignment syntax for unions. https://github.com/ziglang/zig/issues/3125"));
|
||||||
|
@ -2467,6 +2467,7 @@ static Error resolve_union_type(CodeGen *g, ZigType *union_type) {
|
||||||
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
||||||
return ErrorSemanticAnalyzeFail;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_packed) {
|
if (is_packed) {
|
||||||
if ((err = emit_error_unless_type_allowed_in_packed_union(g, field_type, union_field->decl_node))) {
|
if ((err = emit_error_unless_type_allowed_in_packed_union(g, field_type, union_field->decl_node))) {
|
||||||
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
union_type->data.unionation.resolve_status = ResolveStatusInvalid;
|
||||||
|
@ -2925,7 +2926,7 @@ static Error resolve_struct_alignment(CodeGen *g, ZigType *struct_type) {
|
||||||
&field->align))
|
&field->align))
|
||||||
{
|
{
|
||||||
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
|
||||||
return err;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
} else if (packed) {
|
} else if (packed) {
|
||||||
field->align = 1;
|
field->align = 1;
|
||||||
|
|
|
@ -290,10 +290,16 @@ static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) {
|
||||||
case CallingConventionFastcall:
|
case CallingConventionFastcall:
|
||||||
if (g->zig_target->arch == ZigLLVM_x86)
|
if (g->zig_target->arch == ZigLLVM_x86)
|
||||||
return LLVMX86FastcallCallConv;
|
return LLVMX86FastcallCallConv;
|
||||||
return LLVMFastCallConv;
|
return LLVMCCallConv;
|
||||||
case CallingConventionVectorcall:
|
case CallingConventionVectorcall:
|
||||||
if (g->zig_target->arch == ZigLLVM_x86)
|
if (g->zig_target->arch == ZigLLVM_x86)
|
||||||
return LLVMX86VectorCallCallConv;
|
return LLVMX86VectorCallCallConv;
|
||||||
|
// XXX Enable this when the C API exports this enum member too
|
||||||
|
#if 0
|
||||||
|
if (target_is_arm(g->zig_target) &&
|
||||||
|
target_arch_pointer_bit_width(g->zig_target->arch) == 64)
|
||||||
|
return LLVMAARCH64VectorCallCallConv;
|
||||||
|
#endif
|
||||||
return LLVMCCallConv;
|
return LLVMCCallConv;
|
||||||
case CallingConventionAsync:
|
case CallingConventionAsync:
|
||||||
return LLVMFastCallConv;
|
return LLVMFastCallConv;
|
||||||
|
@ -310,7 +316,8 @@ static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) {
|
||||||
return LLVMARMAAPCSVFPCallConv;
|
return LLVMARMAAPCSVFPCallConv;
|
||||||
return LLVMCCallConv;
|
return LLVMCCallConv;
|
||||||
case CallingConventionInterrupt:
|
case CallingConventionInterrupt:
|
||||||
if (g->zig_target->arch == ZigLLVM_x86 || g->zig_target->arch == ZigLLVM_x86_64)
|
if (g->zig_target->arch == ZigLLVM_x86 ||
|
||||||
|
g->zig_target->arch == ZigLLVM_x86_64)
|
||||||
return LLVMX86INTRCallConv;
|
return LLVMX86INTRCallConv;
|
||||||
if (g->zig_target->arch == ZigLLVM_avr)
|
if (g->zig_target->arch == ZigLLVM_avr)
|
||||||
return LLVMAVRINTRCallConv;
|
return LLVMAVRINTRCallConv;
|
||||||
|
|
Loading…
Reference in New Issue