fix typdef param shit

This commit is contained in:
Ellen Arvidsson 2025-06-27 04:23:50 +02:00
parent 33f38c03d6
commit ad1d5776f8
3 changed files with 33 additions and 20 deletions

View file

@ -456,8 +456,8 @@ msph_tree_sphophi_prebind(struct spho_scope *sc,
return (-1); return (-1);
} }
if ((ret = spho_scope_prebind_tp_op(sc, NOM(name), op)) if ((ret = spho_scope_prebind_tp_op(sc,
== -1) { NOM(tpdef->name), op)) == -1) {
return (-1); return (-1);
} }
} else { } else {

View file

@ -30,7 +30,7 @@ static void tree_parse_init(struct tree_parse *,
struct msph_token_stream *, int); struct msph_token_stream *, int);
static int tree_parse_next_token(struct tree_parse *); static int tree_parse_next_token(struct tree_parse *);
static ssize_t tree_ind_fprint(FILE *, int, struct msph_tree *); static int tree_ind_fprint(FILE *, int, struct msph_tree *);
static void free_the_tree(struct msph_tree *); static void free_the_tree(struct msph_tree *);
@ -302,16 +302,21 @@ tree_parse_body(struct tree_parse *p, struct msph_tree *parent)
dir = tree_parse_assert(p, TREE(body)); dir = tree_parse_assert(p, TREE(body));
break; break;
default: default:
break; goto ret;
} }
if (dir == NULL) if (dir == NULL)
break; goto err;
STAILQ_INSERT_TAIL(&body->head, dir, entries); STAILQ_INSERT_TAIL(&body->head, dir, entries);
} }
ret:
return (body); return (body);
err:
free_the_tree(TREE(body));
return (NULL);
} }
@ -346,11 +351,10 @@ tree_parse_tpdef(struct tree_parse *p, struct msph_tree *parent)
if (name == NULL) if (name == NULL)
goto err; goto err;
STAILQ_INSERT_TAIL(&def->params, name, entries); STAILQ_INSERT_TAIL(&def->params, name, entries);
EXPECT_READ_NEXT(res, p, MSPH_TREE_TPDEF, goto err);
} while (CURR_TOKEN(p)->type == TOK_COMMA); } while (CURR_TOKEN(p)->type == TOK_COMMA);
EXPECT_CURR_TOKEN(p, TOK_RBRAK, MSPH_TREE_TPDEF, goto err); EXPECT_CURR_TOKEN(p, TOK_RBRAK, MSPH_TREE_TPDEF, goto err);
EXPECT_READ_NEXT(res, p, MSPH_TREE_TPDEF, goto err);
} }
EXPECT_CURR_TOKEN(p, TOK_EQUALS, MSPH_TREE_TPDEF, goto err); EXPECT_CURR_TOKEN(p, TOK_EQUALS, MSPH_TREE_TPDEF, goto err);
@ -418,7 +422,7 @@ tree_parse_ident_extsize(struct tree_parse *p, struct msph_tree *parent,
TEXT(id)->pos = CURR_TOKEN(p)->pos; TEXT(id)->pos = CURR_TOKEN(p)->pos;
DECOR_INIT(id); DECOR_INIT(id);
if (SPHO_STRLCPY(id->str, CURR_TOKEN(p)->data.str, sizeof(id->str)) if (strlcpy(id->str, CURR_TOKEN(p)->data.str, sizeof(id->str))
>= sizeof(id->str)) { >= sizeof(id->str)) {
MSPH_ERR(CTX(p), MSPH_ERR_TREE_TOOLONG); MSPH_ERR(CTX(p), MSPH_ERR_TREE_TOOLONG);
goto err; goto err;
@ -988,7 +992,6 @@ tree_parse_tpexpr_atom(struct tree_parse *p, struct msph_tree *parent)
tp = NULL; tp = NULL;
} }
SPHO_DEBUG_PRINT("returning tp type=%x\n", TREE(tp)->type);
return (tp); return (tp);
} }
struct msph_tree_tpexpr * struct msph_tree_tpexpr *
@ -1252,12 +1255,15 @@ tree_parse_trait(struct tree_parse *p, struct msph_tree *parent)
DECOR_INIT(trait); DECOR_INIT(trait);
trait->body = NULL; trait->body = NULL;
EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err);
if ((trait->body = tree_parse_body(p, TREE(trait))) == NULL) if ((trait->body = tree_parse_body(p, TREE(trait))) == NULL)
goto err; goto err;
EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err);
EXPECT_CURR_TOKEN(p, TOK_RBRACE, MSPH_TREE_TRAIT, goto err); EXPECT_CURR_TOKEN(p, TOK_RBRACE, MSPH_TREE_TRAIT, goto err);
tree_parse_next_token(p);
return ((struct msph_tree_tpexpr *)trait); return ((struct msph_tree_tpexpr *)trait);
err: err:
free_the_tree(TREE(trait)); free_the_tree(TREE(trait));
@ -1322,7 +1328,6 @@ tree_parse_membdecl(struct tree_parse *p, struct msph_tree *parent)
if ((membd->name = tree_parse_namedecl(p, TREE(membd))) == NULL) if ((membd->name = tree_parse_namedecl(p, TREE(membd))) == NULL)
goto err; goto err;
EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err);
EXPECT_CURR_TOKEN(p, TOK_COLON, MSPH_TREE_MEMBDECL, EXPECT_CURR_TOKEN(p, TOK_COLON, MSPH_TREE_MEMBDECL,
goto err); goto err);
EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err); EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err);
@ -1377,11 +1382,10 @@ free_the_tree(struct msph_tree *tree)
#define MSPH_TREE_INDENT " " #define MSPH_TREE_INDENT " "
__attribute__((format(printf, 3, 4))) __attribute__((format(printf, 3, 4)))
static ssize_t static int
indent_fprintf(FILE *f, int indent, const char *fmt, ...) indent_fprintf(FILE *f, int indent, const char *fmt, ...)
{ {
int res; int res, ret;
ssize_t ret;
int i; int i;
va_list ap; va_list ap;
@ -1391,25 +1395,25 @@ indent_fprintf(FILE *f, int indent, const char *fmt, ...)
for (i = 0; i < indent; i++) { for (i = 0; i < indent; i++) {
res = fprintf(f, "%s", MSPH_TREE_INDENT); res = fprintf(f, "%s", MSPH_TREE_INDENT);
if (res < 0) { if (res < 0) {
return ((ssize_t)res); return (res);
} }
ret += (ssize_t)res; ret += res;
} }
res = vfprintf(f, fmt, ap); res = vfprintf(f, fmt, ap);
if (res < 0) { if (res < 0) {
return ((ssize_t)res); return (res);
} }
ret += (ssize_t)res; ret += res;
va_end(ap); va_end(ap);
return (ret); return (ret);
} }
static ssize_t static int
tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree) tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree)
{ {
ssize_t ret, res; int ret, res;
struct msph_tree_root *root; struct msph_tree_root *root;
struct msph_tree_unit *unit; struct msph_tree_unit *unit;
struct msph_tree_body *body; struct msph_tree_body *body;
@ -1431,6 +1435,7 @@ tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree)
struct msph_tree_paren *paren; struct msph_tree_paren *paren;
struct msph_tree_ident *ident; struct msph_tree_ident *ident;
struct msph_tree_tpexpr *tp; struct msph_tree_tpexpr *tp;
struct msph_tree_namedecl *named;
const char *ident_kind; const char *ident_kind;
ret = 0; ret = 0;
@ -1519,6 +1524,13 @@ tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree)
return (res); return (res);
} }
ret += res; ret += res;
STAILQ_FOREACH(named, &tpdef->params, entries) {
if ((res = tree_ind_fprint(f, indent+1, TREE(named)))
< 0) {
return (res);
}
ret += res;
}
if ((res = tree_ind_fprint(f, indent+1, TREE(tpdef->tp))) < 0) if ((res = tree_ind_fprint(f, indent+1, TREE(tpdef->tp))) < 0)
return (res); return (res);
ret += res; ret += res;

View file

@ -128,6 +128,7 @@ spho_scope_nom_add(struct spho_scope *sc, const char *nomstr, size_t sz)
SPHO_SC_ERR(sc, SPHO_ERR_TOOBIG); SPHO_SC_ERR(sc, SPHO_ERR_TOOBIG);
goto err; goto err;
} }
nom->id = sc->ctx->nom_cnt++;
SLIST_INSERT_HEAD(&sc->noms, nom, entries); SLIST_INSERT_HEAD(&sc->noms, nom, entries);
sc->nom_cnt++; sc->nom_cnt++;