diff --git a/lib/std/io/stream.c3 b/lib/std/io/stream.c3 index cf21a4c7b..8428320c8 100644 --- a/lib/std/io/stream.c3 +++ b/lib/std/io/stream.c3 @@ -34,7 +34,7 @@ fn usz? available(InStream s) s.seek(curr, Seek.SET)!; return len - curr; } - return ^io::UNSUPPORTED_OPERATION; + return io::UNSUPPORTED_OPERATION~; } macro bool @is_instream(#expr) @const diff --git a/src/compiler/parse_expr.c b/src/compiler/parse_expr.c index aeb0573b4..1d9a23ea5 100644 --- a/src/compiler/parse_expr.c +++ b/src/compiler/parse_expr.c @@ -731,23 +731,6 @@ static Expr *parse_raise_expr_suffix(ParseContext *c, Expr *left_side, SourceSpa return expr; } -static Expr *parse_raise_expr(ParseContext *c, Expr *left, SourceSpan lhs_start UNUSED) -{ - ASSERT(!left && "Did not expect a left hand side!"); - - Expr *opt = EXPR_NEW_TOKEN(EXPR_OPTIONAL); - advance(c); - Expr *right_side = parse_precedence(c, PREC_UNARY); - CHECK_EXPR_OR_RET(right_side); - if (right_side->expr_kind == EXPR_TYPEINFO) - { - PRINT_ERROR_AT(right_side, "Expected a fault after '^'."); - return poisoned_expr; - } - opt->inner_expr = right_side; - RANGE_EXTEND_PREV(opt); - return opt; -} /** * post_unary_expr ::= unary_op @@ -2230,7 +2213,7 @@ ParseRule rules[TOKEN_EOF + 1] = { [TOKEN_BANG] = { parse_unary_expr, parse_rethrow_expr, PREC_CALL }, [TOKEN_BYTES] = { parse_bytes_expr, NULL, PREC_NONE }, [TOKEN_BIT_NOT] = { parse_unary_expr, parse_raise_expr_suffix, PREC_CALL }, - [TOKEN_BIT_XOR] = { parse_raise_expr, parse_binary, PREC_BIT }, + [TOKEN_BIT_XOR] = { NULL, parse_binary, PREC_BIT }, [TOKEN_BIT_OR] = { NULL, parse_binary, PREC_BIT }, [TOKEN_AMP] = { parse_unary_expr, parse_binary, PREC_BIT }, [TOKEN_EQEQ] = { NULL, parse_binary, PREC_RELATIONAL }, diff --git a/src/compiler/sema_decls.c b/src/compiler/sema_decls.c index a271aa4bd..6977b6843 100644 --- a/src/compiler/sema_decls.c +++ b/src/compiler/sema_decls.c @@ -5269,6 +5269,7 @@ Decl *sema_analyse_parameterized_identifier(SemaContext *context, Path *decl_pat unsigned id = generic->generic_decl.id; FOREACH(Decl *, g, alias->unit->module->generic_sections) { + if (g->generic_decl.id != id) continue; FOREACH (Decl *, candidate, g->generic_decl.instances) { if (candidate->name == suffix) diff --git a/test/test_suite/generic/overlapping_generic.c3t b/test/test_suite/generic/overlapping_generic.c3t new file mode 100644 index 000000000..44498d1e5 --- /dev/null +++ b/test/test_suite/generic/overlapping_generic.c3t @@ -0,0 +1,14 @@ +import std; +struct Result @generic(WithType2) +{ + fault error; +} +macro Result{WithType} err(fault error) @generic(WithType) => { .error = error }; + +faultdef TESTIN; + +fn int main() +{ + Result{int} x = err{int}(TESTIN); + return 0; +} \ No newline at end of file