summaryrefslogtreecommitdiffstats
path: root/src/test/ui/higher-lifetime-bounds.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/higher-lifetime-bounds.rs')
-rw-r--r--src/test/ui/higher-lifetime-bounds.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/test/ui/higher-lifetime-bounds.rs b/src/test/ui/higher-lifetime-bounds.rs
new file mode 100644
index 000000000..f3393347d
--- /dev/null
+++ b/src/test/ui/higher-lifetime-bounds.rs
@@ -0,0 +1,69 @@
+#![allow(dead_code, non_camel_case_types)]
+
+// Test that bounds on higher-kinded lifetime binders are rejected.
+
+fn bar1<'a, 'b>(
+ x: &'a i32,
+ y: &'b i32,
+ f: for<'xa, 'xb: 'xa+'xa> fn(&'xa i32, &'xb i32) -> &'xa i32)
+ //~^ ERROR lifetime bounds cannot be used in this context
+{
+ // If the bound in f's type would matter, the call below would (have to)
+ // be rejected.
+ f(x, y);
+}
+
+fn bar2<'a, 'b, F: for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32>(
+ //~^ ERROR lifetime bounds cannot be used in this context
+ x: &'a i32,
+ y: &'b i32,
+ f: F)
+{
+ // If the bound in f's type would matter, the call below would (have to)
+ // be rejected.
+ f(x, y);
+}
+
+fn bar3<'a, 'b, F>(
+ x: &'a i32,
+ y: &'b i32,
+ f: F)
+ where F: for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32
+ //~^ ERROR lifetime bounds cannot be used in this context
+{
+ // If the bound in f's type would matter, the call below would (have to)
+ // be rejected.
+ f(x, y);
+}
+
+fn bar4<'a, 'b, F>(
+ x: &'a i32,
+ y: &'b i32,
+ f: F)
+ where for<'xa, 'xb: 'xa> F: Fn(&'xa i32, &'xb i32) -> &'xa i32
+ //~^ ERROR lifetime bounds cannot be used in this context
+{
+ // If the bound in f's type would matter, the call below would (have to)
+ // be rejected.
+ f(x, y);
+}
+
+struct S1<F: for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32>(F);
+//~^ ERROR lifetime bounds cannot be used in this context
+struct S2<F>(F) where F: for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32;
+//~^ ERROR lifetime bounds cannot be used in this context
+struct S3<F>(F) where for<'xa, 'xb: 'xa> F: Fn(&'xa i32, &'xb i32) -> &'xa i32;
+//~^ ERROR lifetime bounds cannot be used in this context
+
+struct S_fnty(for<'xa, 'xb: 'xa> fn(&'xa i32, &'xb i32) -> &'xa i32);
+//~^ ERROR lifetime bounds cannot be used in this context
+
+type T1 = Box<dyn for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32>;
+//~^ ERROR lifetime bounds cannot be used in this context
+
+fn main() {
+ let _ : Option<for<'xa, 'xb: 'xa> fn(&'xa i32, &'xb i32) -> &'xa i32> = None;
+ //~^ ERROR lifetime bounds cannot be used in this context
+ let _ : Option<Box<dyn for<'xa, 'xb: 'xa> Fn(&'xa i32, &'xb i32) -> &'xa i32>> = None;
+ //~^ ERROR lifetime bounds cannot be used in this context
+}