Skip to content

Commit

Permalink
rust: fix ICE during name resolution for impls on unit-types
Browse files Browse the repository at this point in the history
The canonical paths need to support unit-types which are technically a
TupleType with no fields. This handles this case and adds an unreachable.

Fixes Rust-GCC#3036

gcc/rust/ChangeLog:

	* resolve/rust-ast-resolve-type.cc (ResolveTypeToCanonicalPath::visit): add unit-type catch
	* resolve/rust-ast-resolve-type.h: likewise

gcc/testsuite/ChangeLog:

	* rust/compile/nr2/exclude: nr2 cant handle this
	* rust/compile/issue-3036.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
  • Loading branch information
philberty committed Sep 27, 2024
1 parent c6a479f commit 18422c9
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 0 deletions.
9 changes: 9 additions & 0 deletions gcc/rust/resolve/rust-ast-resolve-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,15 @@ ResolveTypeToCanonicalPath::visit (AST::NeverType &type)
result = CanonicalPath::new_seg (type.get_node_id (), "!");
}

void
ResolveTypeToCanonicalPath::visit (AST::TupleType &type)
{
if (!type.is_unit_type ())
rust_unreachable ();

result = CanonicalPath::new_seg (type.get_node_id (), "()");
}

ResolveTypeToCanonicalPath::ResolveTypeToCanonicalPath ()
: ResolverBase (), result (CanonicalPath::create_empty ())
{}
Expand Down
2 changes: 2 additions & 0 deletions gcc/rust/resolve/rust-ast-resolve-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ class ResolveTypeToCanonicalPath : public ResolverBase

void visit (AST::NeverType &type) override;

void visit (AST::TupleType &type) override;

private:
ResolveTypeToCanonicalPath ();

Expand Down
14 changes: 14 additions & 0 deletions gcc/testsuite/rust/compile/issue-3036.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#[lang = "sized"]
trait Sized {}

#[stable(feature = "rust1", since = "1.0.0")]
pub trait Default: Sized {
#[stable(feature = "rust1", since = "1.0.0")]
fn default() -> Self;
}

impl Default for () {
fn default() -> () {
()
}
}
1 change: 1 addition & 0 deletions gcc/testsuite/rust/compile/nr2/exclude
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,4 @@ issue-3082.rs
issue-3139-1.rs
issue-3139-2.rs
issue-3139-3.rs
issue-3036.rs

0 comments on commit 18422c9

Please sign in to comment.