diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index d4517f3a6d18..b2bb7172f244 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -194,7 +194,14 @@ TypeCheckExpr::visit (HIR::CallExpr &expr) HirId variant_id; bool ok = context->lookup_variant_definition ( expr.get_fnexpr ()->get_mappings ().get_hirid (), &variant_id); - rust_assert (ok); + + if (!ok) + { + rust_error_at (expr.get_locus (), ErrorCode::E0423, + "expected function, tuple struct or tuple " + "variant, found enum"); + return; + } TyTy::VariantDef *lookup_variant = nullptr; ok = adt->lookup_variant_by_id (variant_id, &lookup_variant); diff --git a/gcc/testsuite/rust/compile/issue-3046.rs b/gcc/testsuite/rust/compile/issue-3046.rs new file mode 100644 index 000000000000..c982cc98f582 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-3046.rs @@ -0,0 +1,23 @@ +enum Res { + OK, + BAD, +} + +enum LOption { + Some(i32), + None, +} + +fn test(v: LOption) -> Res { + return Res::BAD; +} + + +fn main() { + // Should be: + // test(LOption::Some(2)); + // + test(LOption(2)); + // { dg-error "expected function, tuple struct or tuple variant, found enum" "" { target *-*-* } .-1 } + // { dg-error "failed to resolve type for argument expr in CallExpr" "" { target *-*-* } .-2 } +}