aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-02-27 23:55:03 -0500
committerGitHub <noreply@github.com>2018-02-27 23:55:03 -0500
commit0f449a3ec180f710f8b54023d2c3b3dffcce5ec8 (patch)
treedc68cb68c5fcdc634f5ccbd8d7f7577ffaed37bf
parent439621e44a68b436f958a84fcdb0bdac83613aea (diff)
parent9aa65c0e8e6e4135dcc04bcb388d1fa38c6d10f6 (diff)
downloadzig-0f449a3ec180f710f8b54023d2c3b3dffcce5ec8.tar.gz
zig-0f449a3ec180f710f8b54023d2c3b3dffcce5ec8.zip
Merge pull request #796 from bnoordhuis/fix731-more
allow implicit cast from &const to ?&const &const
-rw-r--r--src/ir.cpp3
-rw-r--r--test/cases/cast.zig31
2 files changed, 33 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index e79235830c..b1fd7104ea 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -8830,7 +8830,8 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
}
} else if (wanted_child_type->id == TypeTableEntryIdPointer &&
wanted_child_type->data.pointer.is_const &&
- is_container(actual_type)) {
+ (actual_type->id == TypeTableEntryIdPointer || 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;
diff --git a/test/cases/cast.zig b/test/cases/cast.zig
index dabf97a799..d2671680c8 100644
--- a/test/cases/cast.zig
+++ b/test/cases/cast.zig
@@ -103,6 +103,37 @@ const Enum = enum {
}
};
+test "implicitly cast indirect pointer to maybe-indirect pointer" {
+ const S = struct {
+ const Self = this;
+ x: u8,
+ fn constConst(p: &const &const Self) u8 {
+ return (*p).x;
+ }
+ fn maybeConstConst(p: ?&const &const Self) u8 {
+ return (*??p).x;
+ }
+ fn constConstConst(p: &const &const &const Self) u8 {
+ return (**p).x;
+ }
+ fn maybeConstConstConst(p: ?&const &const &const Self) u8 {
+ return (**??p).x;
+ }
+ };
+ const s = S { .x = 42 };
+ const p = &s;
+ const q = &p;
+ const r = &q;
+ assert(42 == S.constConst(p));
+ assert(42 == S.constConst(q));
+ assert(42 == S.maybeConstConst(p));
+ assert(42 == S.maybeConstConst(q));
+ assert(42 == S.constConstConst(q));
+ assert(42 == S.constConstConst(r));
+ assert(42 == S.maybeConstConstConst(q));
+ assert(42 == S.maybeConstConstConst(r));
+}
+
test "explicit cast from integer to error type" {
testCastIntToErr(error.ItBroke);
comptime testCastIntToErr(error.ItBroke);