Skip to content

Commit

Permalink
gccrs: Fix bad generic substitution error on fn/adt types
Browse files Browse the repository at this point in the history
When passing generics around we try to adjust them because there are cases
where the names are adjusted from other generics this can fail for traits
because of the implicit Self and we just need to continue on without
adjustment.

Fxies #3382

gcc/rust/ChangeLog:

	* typecheck/rust-substitution-mapper.cc (SubstMapperInternal::visit):
	continue on for trait item mode.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Philip Herron <[email protected]>
  • Loading branch information
philberty committed Feb 3, 2025
1 parent 842c1cf commit 68e24e2
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
8 changes: 6 additions & 2 deletions gcc/rust/typecheck/rust-substitution-mapper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,10 @@ SubstMapperInternal::visit (TyTy::FnType &type)
{
TyTy::SubstitutionArgumentMappings adjusted
= type.adjust_mappings_for_this (mappings);
if (adjusted.is_error ())
if (adjusted.is_error () && !mappings.trait_item_mode ())
return;
if (adjusted.is_error () && mappings.trait_item_mode ())
adjusted = mappings;

TyTy::BaseType *concrete = type.handle_substitions (adjusted);
if (concrete != nullptr)
Expand All @@ -205,8 +207,10 @@ SubstMapperInternal::visit (TyTy::ADTType &type)
{
TyTy::SubstitutionArgumentMappings adjusted
= type.adjust_mappings_for_this (mappings);
if (adjusted.is_error ())
if (adjusted.is_error () && !mappings.trait_item_mode ())
return;
if (adjusted.is_error () && mappings.trait_item_mode ())
adjusted = mappings;

TyTy::BaseType *concrete = type.handle_substitions (adjusted);
if (concrete != nullptr)
Expand Down
61 changes: 61 additions & 0 deletions gcc/testsuite/rust/compile/issue-3382.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#[lang = "sized"]
trait Sized {}

enum Result<T, E> {
#[lang = "Ok"]
Ok(T),
#[lang = "Err"]
Err(E),
}

#[lang = "try"]
pub trait Try {
/// The type of this value when viewed as successful.
// #[unstable(feature = "try_trait", issue = "42327")]
type Ok;
/// The type of this value when viewed as failed.
// #[unstable(feature = "try_trait", issue = "42327")]
type Error;

/// Applies the "?" operator. A return of `Ok(t)` means that the
/// execution should continue normally, and the result of `?` is the
/// value `t`. A return of `Err(e)` means that execution should branch
/// to the innermost enclosing `catch`, or return from the function.
///
/// If an `Err(e)` result is returned, the value `e` will be "wrapped"
/// in the return type of the enclosing scope (which must itself implement
/// `Try`). Specifically, the value `X::from_error(From::from(e))`
/// is returned, where `X` is the return type of the enclosing function.
#[lang = "into_result"]
#[unstable(feature = "try_trait", issue = "42327")]
fn into_result(self) -> Result<Self::Ok, Self::Error>;

/// Wrap an error value to construct the composite result. For example,
/// `Result::Err(x)` and `Result::from_error(x)` are equivalent.
#[lang = "from_error"]
#[unstable(feature = "try_trait", issue = "42327")]
fn from_error(v: Self::Ok) -> Self;

/// Wrap an OK value to construct the composite result. For example,
/// `Result::Ok(x)` and `Result::from_ok(x)` are equivalent.
#[lang = "from_ok"]
#[unstable(feature = "try_trait", issue = "42327")]
fn from_ok(v: Self::Error) -> Self;
}

impl<T, E> Try for Result<T, E> {
type Ok = T;
type Error = E;

fn into_result(self) -> Result<T, E> {
self
}

fn from_ok(v: T) -> Self {
Result::Ok(v)
}

fn from_error(v: E) -> Self {
Result::Err(v)
}
}
1 change: 1 addition & 0 deletions gcc/testsuite/rust/compile/nr2/exclude
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,5 @@ issue-3030.rs
traits12.rs
try-trait.rs
derive-debug1.rs
issue-3382.rs
# please don't delete the trailing newline

0 comments on commit 68e24e2

Please sign in to comment.