Skip to content

Commit

Permalink
gccrs: fix typechecking of Fn trait calls using ADT types
Browse files Browse the repository at this point in the history
Fixes RustGcc#2953

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): fix the ty_id

gcc/testsuite/ChangeLog:

	* rust/compile/nr2/exclude: nr2 cant handle these
	* rust/compile/issue-2953-1.rs: New test.
	* rust/compile/issue-2953-2.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
  • Loading branch information
philberty committed Nov 5, 2024
1 parent dfbd71a commit e82d79c
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 4 deletions.
10 changes: 6 additions & 4 deletions gcc/rust/typecheck/rust-hir-type-check-item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,8 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
= parse_repr_options (attrs, struct_decl.get_locus ());

auto *type = new TyTy::ADTType (
struct_decl.get_mappings ().get_hirid (), mappings.get_next_hir_id (),
struct_decl.get_mappings ().get_hirid (),
struct_decl.get_mappings ().get_hirid (),
struct_decl.get_identifier ().as_string (), ident,
TyTy::ADTType::ADTKind::TUPLE_STRUCT, std::move (variants),
std::move (substitutions), repr,
Expand Down Expand Up @@ -312,7 +313,8 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
= parse_repr_options (attrs, struct_decl.get_locus ());

auto *type = new TyTy::ADTType (
struct_decl.get_mappings ().get_hirid (), mappings.get_next_hir_id (),
struct_decl.get_mappings ().get_hirid (),
struct_decl.get_mappings ().get_hirid (),
struct_decl.get_identifier ().as_string (), ident,
TyTy::ADTType::ADTKind::STRUCT_STRUCT, std::move (variants),
std::move (substitutions), repr,
Expand Down Expand Up @@ -369,7 +371,7 @@ TypeCheckItem::visit (HIR::Enum &enum_decl)
// multi variant ADT
auto *type
= new TyTy::ADTType (enum_decl.get_mappings ().get_hirid (),
mappings.get_next_hir_id (),
enum_decl.get_mappings ().get_hirid (),
enum_decl.get_identifier ().as_string (), ident,
TyTy::ADTType::ADTKind::ENUM, std::move (variants),
std::move (substitutions));
Expand Down Expand Up @@ -440,7 +442,7 @@ TypeCheckItem::visit (HIR::Union &union_decl)

auto *type
= new TyTy::ADTType (union_decl.get_mappings ().get_hirid (),
mappings.get_next_hir_id (),
union_decl.get_mappings ().get_hirid (),
union_decl.get_identifier ().as_string (), ident,
TyTy::ADTType::ADTKind::UNION, std::move (variants),
std::move (substitutions));
Expand Down
27 changes: 27 additions & 0 deletions gcc/testsuite/rust/compile/issue-2953-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#[lang = "sized"]
pub trait Sized {
// Empty.
}

#[lang = "fn_once"]
pub trait FnOnce<Args> {
/// The returned type after the call operator is used.
#[lang = "fn_once_output"]
type Output;

/// Performs the call operation.
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

pub enum Ordering {
/// An ordering where a compared value is less than another.
Less = -1,
/// An ordering where a compared value is equal to another.
Equal = 0,
/// An ordering where a compared value is greater than another.
Greater = 1,
}

pub fn f<F: FnOnce(i32) -> Ordering>(g: F) -> Ordering {
g(1)
}
37 changes: 37 additions & 0 deletions gcc/testsuite/rust/compile/issue-2953-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#[lang = "sized"]
pub trait Sized {
// Empty.
}

#[lang = "fn_once"]
pub trait FnOnce<Args> {
/// The returned type after the call operator is used.
#[lang = "fn_once_output"]
type Output;

/// Performs the call operation.
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

pub enum Ordering {
/// An ordering where a compared value is less than another.
Less = -1,
/// An ordering where a compared value is equal to another.
Equal = 0,
/// An ordering where a compared value is greater than another.
Greater = 1,
}

pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
match compare(&v1, &v2) {
Ordering::Less | Ordering::Equal => v2,
Ordering::Greater => v1,
}
}

pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
match compare(&v1, &v2) {
Ordering::Less | Ordering::Equal => v1,
Ordering::Greater => v2,
}
}
2 changes: 2 additions & 0 deletions gcc/testsuite/rust/compile/nr2/exclude
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,6 @@ iflet.rs
issue-3033.rs
issue-3009.rs
issue-2323.rs
issue-2953-1.rs
issue-2953-2.rs
# please don't delete the trailing newline

0 comments on commit e82d79c

Please sign in to comment.