]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix ICE when constant is missing and expression
authorPhilip Herron <herron.philip@googlemail.com>
Wed, 18 Jun 2025 17:25:14 +0000 (18:25 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:49 +0000 (16:36 +0200)
This is an invalid test case and doesnt work with rustc, we dont fully pick
up the errors. Nr2 does handle this and puts out an extra good diagnostic
but the old NR doesnt so for now i added this to the exclude list and then
when we remove old name resolver this issue goes away.

Fixes Rust-GCC#3642

gcc/rust/ChangeLog:

* hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): check for has_expr
* hir/rust-hir-dump.cc (Dump::visit): likewise
* hir/tree/rust-hir-item.h: add has_expr helper
* resolve/rust-ast-resolve-item.cc (ResolveItem::visit): check for has_expr
* resolve/rust-ast-resolve-stmt.h: likewise
* typecheck/rust-hir-type-check-stmt.cc (TypeCheckStmt::visit): likewise

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: nr2 puts out an extra error
* rust/compile/issue-3642.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/hir/rust-ast-lower-item.cc
gcc/rust/hir/rust-hir-dump.cc
gcc/rust/hir/tree/rust-hir-item.h
gcc/rust/resolve/rust-ast-resolve-item.cc
gcc/rust/resolve/rust-ast-resolve-stmt.h
gcc/rust/typecheck/rust-hir-type-check-stmt.cc
gcc/testsuite/rust/compile/issue-3642.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/nr2/exclude

index 0623065ddd46fe3a31447393f4c672df6a00627e..4e5a747b2a983d01a413ab7a2f5687f0121552dc 100644 (file)
@@ -367,7 +367,9 @@ ASTLoweringItem::visit (AST::ConstantItem &constant)
   HIR::Visibility vis = translate_visibility (constant.get_visibility ());
 
   HIR::Type *type = ASTLoweringType::translate (constant.get_type (), true);
-  HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ());
+  HIR::Expr *expr = nullptr;
+  if (constant.has_expr ())
+    expr = ASTLoweringExpr::translate (constant.get_expr ());
 
   auto crate_num = mappings.get_current_crate ();
   Analysis::NodeMapping mapping (crate_num, constant.get_node_id (),
index 098b3c1e26609c72742ae70953d2f4df44f04733..18589316e9f77ee3a9ee2f174550140968ce88bf 100644 (file)
@@ -1926,7 +1926,8 @@ Dump::visit (ConstantItem &e)
   do_vis_item (e);
   put_field ("identifier", e.get_identifier ().as_string ());
   visit_field ("type", e.get_type ());
-  visit_field ("const_expr", e.get_expr ());
+  if (e.has_expr ())
+    visit_field ("const_expr", e.get_expr ());
   end ("ConstantItem");
 }
 
index d61027732ab91791fbd273c65fd983da573c5400..0f25b379dfa8c45271d4bbdec70d2380b9e7699c 100644 (file)
@@ -1797,6 +1797,8 @@ public:
     return *type;
   }
 
+  bool has_expr () const { return const_expr != nullptr; }
+
   Expr &get_expr () { return *const_expr; }
 
   Identifier get_identifier () const { return identifier; }
index 0937d6577c8b16ba4a78e55c7da312613bb89c57..1d5ebed996964884dd32ab307d31329512996cc5 100644 (file)
@@ -453,7 +453,8 @@ ResolveItem::visit (AST::ConstantItem &constant)
   resolve_visibility (constant.get_visibility ());
 
   ResolveType::go (constant.get_type ());
-  ResolveExpr::go (constant.get_expr (), path, cpath);
+  if (constant.has_expr ())
+    ResolveExpr::go (constant.get_expr (), path, cpath);
 }
 
 void
index d413a7c17ae66b82fe93cc1f8d7f8ccc368cb270..d7145112c82311b9e859a864c506c9d572a13c7b 100644 (file)
@@ -67,7 +67,8 @@ public:
       });
 
     ResolveType::go (constant.get_type ());
-    ResolveExpr::go (constant.get_expr (), prefix, canonical_prefix);
+    if (constant.has_expr ())
+      ResolveExpr::go (constant.get_expr (), prefix, canonical_prefix);
   }
 
   void visit (AST::LetStmt &stmt) override
index 4e53856278f1b8124ccf2ebee0aca8658a22bebc..87141af509fdddbb71970686cfb1e68403793ff7 100644 (file)
@@ -60,6 +60,12 @@ void
 TypeCheckStmt::visit (HIR::ConstantItem &constant)
 {
   TyTy::BaseType *type = TypeCheckType::Resolve (constant.get_type ());
+  if (!constant.has_expr ())
+    {
+      infered = type;
+      return;
+    }
+
   TyTy::BaseType *expr_type = TypeCheckExpr::Resolve (constant.get_expr ());
 
   infered = coercion_site (
diff --git a/gcc/testsuite/rust/compile/issue-3642.rs b/gcc/testsuite/rust/compile/issue-3642.rs
new file mode 100644 (file)
index 0000000..6d9decc
--- /dev/null
@@ -0,0 +1,9 @@
+#[lang = "sized"]
+trait Sized {}
+
+pub trait T<X> {
+    const D: i32 = {
+        // { dg-error "mismatched types, expected .i32. but got .()." "" { target *-*-* } .-1 }
+        const C: X;
+    };
+}
index 58a20146091f1a05a2018c8179e3319dcc21fa80..b67d0e50a8a366f3861fc89b86a4f5fec997217c 100644 (file)
@@ -4,4 +4,5 @@ issue-1487.rs
 issue-2015.rs
 issue-3454.rs
 impl_trait_generic_arg.rs
+issue-3642.rs
 # please don't delete the trailing newline