Skip to content

Commit

Permalink
gccrs: add diagnostic for E0229 no associated type arguments allowed …
Browse files Browse the repository at this point in the history
…here

It seems bounds in qualified paths are not allowed to specify associated
type bindings because its going to be associated with the impl block
anyway.

Fixes #2369

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-base.h: add flag
	* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): likewise
	* typecheck/rust-tyty-bounds.cc: new diagnostic

gcc/testsuite/ChangeLog:

	* rust/compile/issue-2369.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
  • Loading branch information
philberty committed Feb 12, 2025
1 parent eee682c commit c005754
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 4 deletions.
3 changes: 2 additions & 1 deletion gcc/rust/typecheck/rust-hir-type-check-base.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ class TypeCheckBase
TyTy::TypeBoundPredicate get_predicate_from_bound (
HIR::TypePath &path,
tl::optional<std::reference_wrapper<HIR::Type>> associated_self,
BoundPolarity polarity = BoundPolarity::RegularBound);
BoundPolarity polarity = BoundPolarity::RegularBound,
bool is_qualified_type = false);

bool check_for_unconstrained (
const std::vector<TyTy::SubstitutionParamMapping> &params_to_constrain,
Expand Down
6 changes: 4 additions & 2 deletions gcc/rust/typecheck/rust-hir-type-check-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,10 @@ TypeCheckType::visit (HIR::QualifiedPathInType &path)
return;

// get the predicate for the bound
auto specified_bound = get_predicate_from_bound (qual_path_type.get_trait (),
qual_path_type.get_type ());
auto specified_bound
= get_predicate_from_bound (qual_path_type.get_trait (),
qual_path_type.get_type (),
BoundPolarity::RegularBound, true);
if (specified_bound.is_error ())
return;

Expand Down
17 changes: 16 additions & 1 deletion gcc/rust/typecheck/rust-tyty-bounds.cc
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ TyTy::TypeBoundPredicate
TypeCheckBase::get_predicate_from_bound (
HIR::TypePath &type_path,
tl::optional<std::reference_wrapper<HIR::Type>> associated_self,
BoundPolarity polarity)
BoundPolarity polarity, bool is_qualified_type_path)
{
TyTy::TypeBoundPredicate lookup = TyTy::TypeBoundPredicate::error ();
bool already_resolved
Expand All @@ -222,6 +222,21 @@ TypeCheckBase::get_predicate_from_bound (
if (final_generic_seg.has_generic_args ())
{
args = final_generic_seg.get_generic_args ();
if (args.get_binding_args ().size () > 0
&& associated_self.has_value () && is_qualified_type_path)
{
auto &binding_args = args.get_binding_args ();

rich_location r (line_table, args.get_locus ());
for (auto it = binding_args.begin (); it != binding_args.end ();
it++)
{
auto &arg = *it;
r.add_fixit_remove (arg.get_locus ());
}
rust_error_at (r, ErrorCode::E0229,
"associated type bindings are not allowed here");
}
}
}
break;
Expand Down
21 changes: 21 additions & 0 deletions gcc/testsuite/rust/compile/issue-2369.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#[lang = "sized"]
trait Sized {}

fn main() {
pub trait Foo {
type A;
fn boo(&self) -> <Self as Foo>::A;
}

struct Bar;

impl Foo for isize {
type A = usize;
fn boo(&self) -> usize {
42
}
}

fn baz<I>(x: &<I as Foo<A = Bar>>::A) {}
// { dg-error "associated type bindings are not allowed here .E0229." "" { target *-*-* } .-1 }
}

0 comments on commit c005754

Please sign in to comment.