]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: add diagnostic for E0229 no associated type arguments allowed here
authorPhilip Herron <herron.philip@googlemail.com>
Wed, 12 Feb 2025 17:10:31 +0000 (17:10 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 24 Mar 2025 12:07:05 +0000 (13:07 +0100)
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 Rust-GCC#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 <herron.philip@googlemail.com>
gcc/rust/typecheck/rust-hir-type-check-base.h
gcc/rust/typecheck/rust-hir-type-check-type.cc
gcc/rust/typecheck/rust-tyty-bounds.cc
gcc/testsuite/rust/compile/issue-2369.rs [new file with mode: 0644]

index e720b9479161bbda49506e9d987caf2623dbc835..8a1bf6f4cb35668b996509771ae85d1f8b6d2030 100644 (file)
@@ -40,7 +40,8 @@ protected:
   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,
index 327cbb010a444b55ee09233a8e31b17b59cb9025..6a09772d0231de11e974a10639a18c63c7f86db1 100644 (file)
@@ -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;
 
index 3e42427e2ec0c085238eaa08e149270278e4351d..fc35abb6ec41d5744b0c89253b54537b2bb12391 100644 (file)
@@ -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
@@ -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;
diff --git a/gcc/testsuite/rust/compile/issue-2369.rs b/gcc/testsuite/rust/compile/issue-2369.rs
new file mode 100644 (file)
index 0000000..9475aef
--- /dev/null
@@ -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 }
+}