aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-02-26 03:20:46 -0500
committerGitHub <noreply@github.com>2018-02-26 03:20:46 -0500
commit1eecfdaa9b9c04e50058695b8df9978ef47f121a (patch)
tree72f0b31cfeda469d31ec69ec9c2277577494ba27 /src
parent08d595b4724217f0b2b10cd3b9e31a71698cf5c1 (diff)
parentf11b9480192dea44acb92cb9edd7a91c7c73cd2f (diff)
downloadzig-1eecfdaa9b9c04e50058695b8df9978ef47f121a.tar.gz
zig-1eecfdaa9b9c04e50058695b8df9978ef47f121a.zip
Merge pull request #785 from bnoordhuis/fix731
allow implicit cast from `S` to `?&const S`
Diffstat (limited to 'src')
-rw-r--r--src/ir.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index b276abff33..e79235830c 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -8817,16 +8817,29 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
// explicit cast from child type of maybe type to maybe type
if (wanted_type->id == TypeTableEntryIdMaybe) {
- if (types_match_const_cast_only(ira, wanted_type->data.maybe.child_type, actual_type, source_node).id == ConstCastResultIdOk) {
+ TypeTableEntry *wanted_child_type = wanted_type->data.maybe.child_type;
+ if (types_match_const_cast_only(ira, wanted_child_type, actual_type, source_node).id == ConstCastResultIdOk) {
return ir_analyze_maybe_wrap(ira, source_instr, value, wanted_type);
} else if (actual_type->id == TypeTableEntryIdNumLitInt ||
actual_type->id == TypeTableEntryIdNumLitFloat)
{
- if (ir_num_lit_fits_in_other_type(ira, value, wanted_type->data.maybe.child_type, true)) {
+ if (ir_num_lit_fits_in_other_type(ira, value, wanted_child_type, true)) {
return ir_analyze_maybe_wrap(ira, source_instr, value, wanted_type);
} else {
return ira->codegen->invalid_instruction;
}
+ } else if (wanted_child_type->id == TypeTableEntryIdPointer &&
+ wanted_child_type->data.pointer.is_const &&
+ is_container(actual_type)) {
+ IrInstruction *cast1 = ir_analyze_cast(ira, source_instr, wanted_child_type, value);
+ if (type_is_invalid(cast1->value.type))
+ return ira->codegen->invalid_instruction;
+
+ IrInstruction *cast2 = ir_analyze_cast(ira, source_instr, wanted_type, cast1);
+ if (type_is_invalid(cast2->value.type))
+ return ira->codegen->invalid_instruction;
+
+ return cast2;
}
}