about summary refs log tree commit diff
path: root/tests/ui/internal/internal-unstable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/internal/internal-unstable.rs')
-rw-r--r--tests/ui/internal/internal-unstable.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/ui/internal/internal-unstable.rs b/tests/ui/internal/internal-unstable.rs
new file mode 100644
index 00000000000..b8987d3e13c
--- /dev/null
+++ b/tests/ui/internal/internal-unstable.rs
@@ -0,0 +1,56 @@
+// aux-build:internal_unstable.rs
+
+#![feature(allow_internal_unstable)]
+#[allow(dead_code)]
+
+#[macro_use]
+extern crate internal_unstable;
+
+struct Baz {
+    #[allow_internal_unstable]
+    //^ WARN `#[allow_internal_unstable]` is ignored on struct fields and match arms
+    baz: u8,
+}
+
+macro_rules! foo {
+    ($e: expr, $f: expr) => {{
+        $e;
+        $f;
+        internal_unstable::unstable(); //~ ERROR use of unstable
+    }}
+}
+
+#[allow_internal_unstable(function)]
+macro_rules! bar {
+    ($e: expr) => {{
+        foo!($e,
+             internal_unstable::unstable());
+        internal_unstable::unstable();
+    }}
+}
+
+fn main() {
+    // ok, the instability is contained.
+    call_unstable_allow!();
+    construct_unstable_allow!(0);
+    |x: internal_unstable::Foo| { call_method_allow!(x) };
+    |x: internal_unstable::Bar| { access_field_allow!(x) };
+    |x: internal_unstable::Bar| { access_field_allow2!(x) }; // regression test for #77088
+
+    // bad.
+    pass_through_allow!(internal_unstable::unstable()); //~ ERROR use of unstable
+
+    pass_through_noallow!(internal_unstable::unstable()); //~ ERROR use of unstable
+
+
+
+    println!("{:?}", internal_unstable::unstable()); //~ ERROR use of unstable
+
+    bar!(internal_unstable::unstable()); //~ ERROR use of unstable
+
+    match true {
+        #[allow_internal_unstable]
+        //^ WARN `#[allow_internal_unstable]` is ignored on struct fields and match arms
+        _ => {}
+    }
+}