summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0222.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0222.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0222.md52
1 files changed, 52 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0222.md b/compiler/rustc_error_codes/src/error_codes/E0222.md
new file mode 100644
index 000000000..f929f219a
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0222.md
@@ -0,0 +1,52 @@
+An attempt was made to constrain an associated type.
+
+Erroneous code example:
+
+```compile_fail,E0222
+pub trait Vehicle {
+ type Color;
+}
+
+pub trait Box {
+ type Color;
+}
+
+pub trait BoxCar : Box + Vehicle {}
+
+fn dent_object<COLOR>(c: dyn BoxCar<Color=COLOR>) {} // Invalid constraint
+```
+
+In this example, `BoxCar` has two supertraits: `Vehicle` and `Box`. Both of
+these traits define an associated type `Color`. `BoxCar` inherits two types
+with that name from both supertraits. Because of this, we need to use the
+fully qualified path syntax to refer to the appropriate `Color` associated
+type, either `<BoxCar as Vehicle>::Color` or `<BoxCar as Box>::Color`, but this
+syntax is not allowed to be used in a function signature.
+
+In order to encode this kind of constraint, a `where` clause and a new type
+parameter are needed:
+
+```
+pub trait Vehicle {
+ type Color;
+}
+
+pub trait Box {
+ type Color;
+}
+
+pub trait BoxCar : Box + Vehicle {}
+
+// Introduce a new `CAR` type parameter
+fn foo<CAR, COLOR>(
+ c: CAR,
+) where
+ // Bind the type parameter `CAR` to the trait `BoxCar`
+ CAR: BoxCar,
+ // Further restrict `<BoxCar as Vehicle>::Color` to be the same as the
+ // type parameter `COLOR`
+ CAR: Vehicle<Color = COLOR>,
+ // We can also simultaneously restrict the other trait's associated type
+ CAR: Box<Color = COLOR>
+{}
+```