gccrs: Add missing bounds checks on associated impl
gccrs now correctly validates trait bounds for associated impls, fixing a bug where incorrect implementations could be accepted.
This commit enhances gccrs’s type checking by adding necessary bounds checks for associated trait implementations. Previously, the compiler might accept an impl<T: A> B for S<T> even if the concrete type T did not satisfy the bound A when it was actually used. The fix ensures that trait bounds are validated after generic arguments are bound, preventing incorrect implementations from being accepted and resolving issues with trait resolution in method calls.
In Details
This change in gccrs addresses a flaw in AssociatedImplTrait::bind_impl_for_projection and related functions (bind_impl_for_bound, validate_call_argument_associated_impl_bounds). It ensures that when a generic impl like impl<T: A> B for S<T> is used with a concrete type Bad (i.e., T = Bad), the bound Bad: A is checked. This validation happens during expression checking (e.g., call-expr, method-call) after argument binding, preventing invalid type instantiations and resolving issues like Rust-GCC/gccrs#4678.
- associated impl
- An implementation block in Rust that provides a trait for a generic type, where the trait itself might have associated types or methods.
- trait bounds
- Constraints on generic types in Rust, specifying that a type must implement certain traits. For example,
T: DisplaymeansTmust implement theDisplaytrait. - bind the arguments
- In generic programming, this refers to the process of matching concrete types provided by the user to the generic type parameters defined in a function, struct, or trait.
- call-expr
- An expression in the Rust Abstract Syntax Tree (AST) or Intermediate Representation (IR) that represents a function call.
- method-call expr
- An expression representing a call to a method associated with a type instance.