ref: 034acf0ceac80411fc85bbd4cc9e237d26a6e36c
parent: 5456cd41e88678aec8b594f6a1488d3f388d99ed
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Dec 5 17:30:09 EST 2017
Error correctly when a const has no init. This happens with externs.
--- a/mi/match.c
+++ b/mi/match.c
@@ -275,12 +275,6 @@
}
static int
-ismatchable(Type *ty)
-{
- return ty->type != Tyfunc && ty->type != Tycode && ty->type != Tyvalist;
-}
-
-static int
addwildrec(Srcloc loc, Type *ty, Dtree *start, Dtree *accept, Dtree ***end, size_t *nend)
{
Dtree *next, **last, **tail;
@@ -659,6 +653,7 @@
{
int ret;
Node *dcl;
+ Type *ty;
pat = fold(pat, 1);
ret = 0;
@@ -666,8 +661,11 @@
case Ovar:
dcl = decls[pat->expr.did];
if (dcl->decl.isconst) {
- if (!ismatchable(decltype(dcl)))
- fatal(dcl, "matching unmatchable type %s", tystr(decltype(dcl)));
+ ty = decltype(dcl);
+ if (ty->type == Tyfunc || ty->type == Tycode || ty->type == Tyvalist)
+ fatal(dcl, "bad pattern %s:%s: unmatchable type", declname(dcl), tystr(ty));
+ if (!dcl->decl.init)
+ fatal(dcl, "bad pattern %s:%s: missing initializer", declname(dcl), tystr(ty));
ret = addpat(dcl->decl.init, val, start, accept, cap, ncap, end, nend);
} else {
ret = addwild(pat, val, start, accept, cap, ncap, end, nend);