[gcc r15-8229] gccrs: [gccrs#3046] ICE on failing to find enum variant

Arthur Cohen cohenarthur@gcc.gnu.org
Mon Mar 17 15:45:49 GMT 2025


https://gcc.gnu.org/g:75dce4d629249a31bebd5e58e6f13e5d3df04711

commit r15-8229-g75dce4d629249a31bebd5e58e6f13e5d3df04711
Author: Liam Naddell <liam.naddell@mail.utoronto.ca>
Date:   Fri Jul 12 20:56:08 2024 -0400

    gccrs: [gccrs#3046] ICE on failing to find enum variant
    
    gcc/rust/ChangeLog:
            * typecheck/rust-hir-type-check-expr.cc:
            Fix ICE caused by not finding enum variant by adding new error
            message
    
    gcc/testsuite/ChangeLog:
            * rust/compile/issue-3046.rs:
            Add test for new error message
    
    Signed-off-by: Liam Naddell <liam.naddell@mail.utoronto.ca>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-expr.cc |  9 ++++++++-
 gcc/testsuite/rust/compile/issue-3046.rs       | 23 +++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 6212660e571d..0e897813d8f0 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 }
+}


More information about the Gcc-cvs mailing list