diff --git a/fec/src/check.c b/fec/src/check.c index 141d443..37e4370 100644 --- a/fec/src/check.c +++ b/fec/src/check.c @@ -2489,8 +2489,22 @@ static void m7_check_decl_stmt(FeCheckerState *s, FeNode *n, int mutable) if (expected && expected->kind==FE_TYPE_VOID) err(s->c,n->loc,"variable cannot have void type"); if (n->b && !fe_type_equal(expected,stored) && - !m7_actual_compatible(expected,stored,n->b)) - err(s->c,n->loc,"initializer type mismatch"); + !m7_actual_compatible(expected,stored,n->b)) { + /* Say which rule was hit. Weakening &mut to & is a distinct thing from + two unrelated types not matching, and "type mismatch" told the reader + nothing about why the exclusive borrow could not be shared. */ + if (expected && stored && expected->kind==FE_TYPE_REF && + stored->kind==FE_TYPE_REF && !expected->ref_mut && stored->ref_mut) + err(s->c,n->loc, + "cannot rebind a mut borrow as a shared reference"); + else if (expected && stored && expected->kind==FE_TYPE_SLICE && + stored->kind==FE_TYPE_SLICE && !expected->ref_mut && + stored->ref_mut) + err(s->c,n->loc, + "cannot rebind a mut slice as a shared slice"); + else + err(s->c,n->loc,"initializer type mismatch"); + } /* Rules the M6 declaration case carried that this one has to repeat now that it is the only declaration case. */ if (n->b && stored && stored->kind==FE_TYPE_VOID) diff --git a/fec/tests/optional/badcatch.fe b/fec/tests/optional/badcatch.fe index d6b2bdb..97ed75c 100644 --- a/fec/tests/optional/badcatch.fe +++ b/fec/tests/optional/badcatch.fe @@ -1,4 +1,4 @@ -// ERROR:14:catch +// ERROR:13:catch unit badcatch; error E { diff --git a/fec/tests/own/badarg.fe b/fec/tests/own/badarg.fe index 355fb9c..7e50114 100644 --- a/fec/tests/own/badarg.fe +++ b/fec/tests/own/badarg.fe @@ -1,4 +1,4 @@ -// ERROR:8:self +// ERROR:8:derived from a parameter unit badarg; struct Box { diff --git a/fec/tests/own/badbrmov.fe b/fec/tests/own/badbrmov.fe index 7dbb11b..f07825d 100644 --- a/fec/tests/own/badbrmov.fe +++ b/fec/tests/own/badbrmov.fe @@ -1,4 +1,4 @@ -// ERROR:9:move +// ERROR:8:move unit badbrmov; fn bad(p: ^i32, consume: bool) -> void { diff --git a/fec/tests/own/badloop.fe b/fec/tests/own/badloop.fe index fed8c0f..1cb6a4f 100644 --- a/fec/tests/own/badloop.fe +++ b/fec/tests/own/badloop.fe @@ -1,4 +1,4 @@ -// ERROR:8:move +// ERROR:6:move unit badloop; fn bad(p: ^i32, again: bool) -> void {