summaryrefslogtreecommitdiffstats
path: root/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs')
-rw-r--r--tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs772
1 files changed, 772 insertions, 0 deletions
diff --git a/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs
new file mode 100644
index 000000000..1fa315f3d
--- /dev/null
+++ b/tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.rs
@@ -0,0 +1,772 @@
+//~ NOTE not a function
+//~| NOTE not a foreign function or static
+//~| NOTE cannot be applied to crates
+//~| NOTE not an `extern` block
+// This test enumerates as many compiler-builtin ungated attributes as
+// possible (that is, all the mutually compatible ones), and checks
+// that we get "expected" (*) warnings for each in the various weird
+// places that users might put them in the syntax.
+//
+// (*): The word "expected" is in quotes above because the cases where
+// warnings are and are not emitted might not match a user's intuition
+// nor the rustc developers' intent. I am really just trying to
+// capture today's behavior in a test, not so that it become enshrined
+// as the absolute behavior going forward, but rather so that we do
+// not change the behavior in the future without even being *aware* of
+// the change when it happens.
+//
+// At the time of authoring, the attributes here are listed in the
+// order that they occur in `librustc_feature`.
+//
+// Any builtin attributes that:
+//
+// - are not stable, or
+//
+// - could not be included here covering the same cases as the other
+// attributes without raising an *error* from rustc (note though
+// that warnings are of course expected)
+//
+// have their own test case referenced by filename in an inline
+// comment.
+//
+// The test feeds numeric inputs to each attribute that accepts them
+// without error. We do this for two reasons: (1.) to exercise how
+// inputs are handled by each, and (2.) to ease searching for related
+// occurrences in the source text.
+
+// check-pass
+
+#![feature(test)]
+#![warn(unused_attributes, unknown_lints)]
+//~^ NOTE the lint level is defined here
+//~| NOTE the lint level is defined here
+
+// UNGATED WHITE-LISTED BUILT-IN ATTRIBUTES
+
+#![warn(x5400)] //~ WARN unknown lint: `x5400`
+#![allow(x5300)] //~ WARN unknown lint: `x5300`
+#![forbid(x5200)] //~ WARN unknown lint: `x5200`
+#![deny(x5100)] //~ WARN unknown lint: `x5100`
+#![macro_use] // (allowed if no argument; see issue-43160-gating-of-macro_use.rs)
+// skipping testing of cfg
+// skipping testing of cfg_attr
+#![should_panic] //~ WARN `#[should_panic]` only has an effect
+#![ignore] //~ WARN `#[ignore]` only has an effect on functions
+#![no_implicit_prelude]
+#![reexport_test_harness_main = "2900"]
+// see gated-link-args.rs
+// see issue-43106-gating-of-macro_escape.rs for crate-level; but non crate-level is below at "2700"
+// (cannot easily test gating of crate-level #[no_std]; but non crate-level is below at "2600")
+#![proc_macro_derive()] //~ WARN `#[proc_macro_derive]` only has an effect
+#![doc = "2400"]
+#![cold] //~ WARN attribute should be applied to a function
+//~^ WARN this was previously accepted
+#![link()] //~ WARN attribute should be applied to an `extern` block
+//~^ WARN this was previously accepted
+#![link_name = "1900"]
+//~^ WARN attribute should be applied to a foreign function
+//~^^ WARN this was previously accepted by the compiler
+#![link_section = "1800"]
+//~^ WARN attribute should be applied to a function or static
+//~^^ WARN this was previously accepted by the compiler
+#![must_use]
+//~^ WARN `#[must_use]` has no effect
+// see issue-43106-gating-of-stable.rs
+// see issue-43106-gating-of-unstable.rs
+// see issue-43106-gating-of-deprecated.rs
+#![windows_subsystem = "windows"]
+
+// UNGATED CRATE-LEVEL BUILT-IN ATTRIBUTES
+
+#![crate_name = "0900"]
+#![crate_type = "bin"] // cannot pass "0800" here
+
+#![crate_id = "10"]
+//~^ WARN use of deprecated attribute
+//~| HELP remove this attribute
+//~| NOTE `#[warn(deprecated)]` on by default
+
+// FIXME(#44232) we should warn that this isn't used.
+#![feature(rust1)]
+//~^ WARN no longer requires an attribute to enable
+//~| NOTE `#[warn(stable_features)]` on by default
+
+#![no_start]
+//~^ WARN use of deprecated attribute
+//~| HELP remove this attribute
+
+// (cannot easily gating state of crate-level #[no_main]; but non crate-level is below at "0400")
+#![no_builtins]
+#![recursion_limit = "0200"]
+#![type_length_limit = "0100"]
+
+// USES OF BUILT-IN ATTRIBUTES IN OTHER ("UNUSUAL") PLACES
+
+#[warn(x5400)]
+//~^ WARN unknown lint: `x5400`
+mod warn {
+ mod inner { #![warn(x5400)] }
+ //~^ WARN unknown lint: `x5400`
+
+ #[warn(x5400)] fn f() { }
+ //~^ WARN unknown lint: `x5400`
+
+ #[warn(x5400)] struct S;
+ //~^ WARN unknown lint: `x5400`
+
+ #[warn(x5400)] type T = S;
+ //~^ WARN unknown lint: `x5400`
+
+ #[warn(x5400)] impl S { }
+ //~^ WARN unknown lint: `x5400`
+}
+
+#[allow(x5300)]
+//~^ WARN unknown lint: `x5300`
+mod allow {
+ mod inner { #![allow(x5300)] }
+ //~^ WARN unknown lint: `x5300`
+
+ #[allow(x5300)] fn f() { }
+ //~^ WARN unknown lint: `x5300`
+
+ #[allow(x5300)] struct S;
+ //~^ WARN unknown lint: `x5300`
+
+ #[allow(x5300)] type T = S;
+ //~^ WARN unknown lint: `x5300`
+
+ #[allow(x5300)] impl S { }
+ //~^ WARN unknown lint: `x5300`
+}
+
+#[forbid(x5200)]
+//~^ WARN unknown lint: `x5200`
+mod forbid {
+ mod inner { #![forbid(x5200)] }
+ //~^ WARN unknown lint: `x5200`
+
+ #[forbid(x5200)] fn f() { }
+ //~^ WARN unknown lint: `x5200`
+
+ #[forbid(x5200)] struct S;
+ //~^ WARN unknown lint: `x5200`
+
+ #[forbid(x5200)] type T = S;
+ //~^ WARN unknown lint: `x5200`
+
+ #[forbid(x5200)] impl S { }
+ //~^ WARN unknown lint: `x5200`
+}
+
+#[deny(x5100)]
+//~^ WARN unknown lint: `x5100`
+mod deny {
+ mod inner { #![deny(x5100)] }
+ //~^ WARN unknown lint: `x5100`
+
+ #[deny(x5100)] fn f() { }
+ //~^ WARN unknown lint: `x5100`
+
+ #[deny(x5100)] struct S;
+ //~^ WARN unknown lint: `x5100`
+
+ #[deny(x5100)] type T = S;
+ //~^ WARN unknown lint: `x5100`
+
+ #[deny(x5100)] impl S { }
+ //~^ WARN unknown lint: `x5100`
+}
+
+#[macro_use]
+mod macro_use {
+ mod inner { #![macro_use] }
+
+ #[macro_use] fn f() { }
+ //~^ `#[macro_use]` only has an effect
+
+ #[macro_use] struct S;
+ //~^ `#[macro_use]` only has an effect
+
+ #[macro_use] type T = S;
+ //~^ `#[macro_use]` only has an effect
+
+ #[macro_use] impl S { }
+ //~^ `#[macro_use]` only has an effect
+}
+
+#[macro_export]
+//~^ WARN `#[macro_export]` only has an effect on macro definitions
+mod macro_export {
+ mod inner { #![macro_export] }
+ //~^ WARN `#[macro_export]` only has an effect on macro definitions
+
+ #[macro_export] fn f() { }
+ //~^ WARN `#[macro_export]` only has an effect on macro definitions
+
+ #[macro_export] struct S;
+ //~^ WARN `#[macro_export]` only has an effect on macro definitions
+
+ #[macro_export] type T = S;
+ //~^ WARN `#[macro_export]` only has an effect on macro definitions
+
+ #[macro_export] impl S { }
+ //~^ WARN `#[macro_export]` only has an effect on macro definitions
+}
+
+// At time of unit test authorship, if compiling without `--test` then
+// non-crate-level #[test] attributes seem to be ignored.
+
+#[test]
+mod test { mod inner { #![test] }
+
+ fn f() { }
+
+ struct S;
+
+ type T = S;
+
+ impl S { }
+}
+
+// At time of unit test authorship, if compiling without `--test` then
+// non-crate-level #[bench] attributes seem to be ignored.
+
+#[bench]
+mod bench {
+ mod inner { #![bench] }
+
+ #[bench]
+ struct S;
+
+ #[bench]
+ type T = S;
+
+ #[bench]
+ impl S { }
+}
+
+#[path = "3800"]
+mod path {
+ mod inner { #![path="3800"] }
+
+ #[path = "3800"] fn f() { }
+ //~^ WARN `#[path]` only has an effect
+
+ #[path = "3800"] struct S;
+ //~^ WARN `#[path]` only has an effect
+
+ #[path = "3800"] type T = S;
+ //~^ WARN `#[path]` only has an effect
+
+ #[path = "3800"] impl S { }
+ //~^ WARN `#[path]` only has an effect
+}
+
+#[automatically_derived]
+//~^ WARN `#[automatically_derived]` only has an effect
+mod automatically_derived {
+ mod inner { #![automatically_derived] }
+ //~^ WARN `#[automatically_derived]
+
+ #[automatically_derived] fn f() { }
+ //~^ WARN `#[automatically_derived]
+
+ #[automatically_derived] struct S;
+ //~^ WARN `#[automatically_derived]
+
+ #[automatically_derived] type T = S;
+ //~^ WARN `#[automatically_derived]
+
+ #[automatically_derived] impl S { }
+}
+
+#[no_mangle]
+//~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+mod no_mangle {
+ //~^ NOTE not a free function, impl method or static
+ mod inner { #![no_mangle] }
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+
+ #[no_mangle] fn f() { }
+
+ #[no_mangle] struct S;
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+
+ #[no_mangle] type T = S;
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+
+ #[no_mangle] impl S { }
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+
+ trait Tr {
+ #[no_mangle] fn foo();
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+
+ #[no_mangle] fn bar() {}
+ //~^ WARN attribute should be applied to a free function, impl method or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a free function, impl method or static
+ }
+}
+
+#[should_panic]
+//~^ WARN `#[should_panic]` only has an effect on
+mod should_panic {
+ mod inner { #![should_panic] }
+ //~^ WARN `#[should_panic]` only has an effect on
+
+ #[should_panic] fn f() { }
+
+ #[should_panic] struct S;
+ //~^ WARN `#[should_panic]` only has an effect on
+
+ #[should_panic] type T = S;
+ //~^ WARN `#[should_panic]` only has an effect on
+
+ #[should_panic] impl S { }
+ //~^ WARN `#[should_panic]` only has an effect on
+}
+
+#[ignore]
+//~^ WARN `#[ignore]` only has an effect on functions
+mod ignore {
+ mod inner { #![ignore] }
+ //~^ WARN `#[ignore]` only has an effect on functions
+
+ #[ignore] fn f() { }
+
+ #[ignore] struct S;
+ //~^ WARN `#[ignore]` only has an effect on functions
+
+ #[ignore] type T = S;
+ //~^ WARN `#[ignore]` only has an effect on functions
+
+ #[ignore] impl S { }
+ //~^ WARN `#[ignore]` only has an effect on functions
+}
+
+#[no_implicit_prelude]
+mod no_implicit_prelude {
+ mod inner { #![no_implicit_prelude] }
+
+ #[no_implicit_prelude] fn f() { }
+ //~^ WARN `#[no_implicit_prelude]` only has an effect
+
+ #[no_implicit_prelude] struct S;
+ //~^ WARN `#[no_implicit_prelude]` only has an effect
+
+ #[no_implicit_prelude] type T = S;
+ //~^ WARN `#[no_implicit_prelude]` only has an effect
+
+ #[no_implicit_prelude] impl S { }
+ //~^ WARN `#[no_implicit_prelude]` only has an effect
+}
+
+#[reexport_test_harness_main = "2900"]
+//~^ WARN crate-level attribute should be
+mod reexport_test_harness_main {
+ mod inner { #![reexport_test_harness_main="2900"] }
+ //~^ WARN crate-level attribute should be
+
+ #[reexport_test_harness_main = "2900"] fn f() { }
+ //~^ WARN crate-level attribute should be
+
+ #[reexport_test_harness_main = "2900"] struct S;
+ //~^ WARN crate-level attribute should be
+
+ #[reexport_test_harness_main = "2900"] type T = S;
+ //~^ WARN crate-level attribute should be
+
+ #[reexport_test_harness_main = "2900"] impl S { }
+ //~^ WARN crate-level attribute should be
+}
+
+// Cannot feed "2700" to `#[macro_escape]` without signaling an error.
+#[macro_escape]
+//~^ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
+mod macro_escape {
+ mod inner { #![macro_escape] }
+ //~^ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
+ //~| HELP try an outer attribute: `#[macro_use]`
+
+ #[macro_escape] fn f() { }
+ //~^ WARN `#[macro_escape]` only has an effect
+
+ #[macro_escape] struct S;
+ //~^ WARN `#[macro_escape]` only has an effect
+
+ #[macro_escape] type T = S;
+ //~^ WARN `#[macro_escape]` only has an effect
+
+ #[macro_escape] impl S { }
+ //~^ WARN `#[macro_escape]` only has an effect
+}
+
+#[no_std]
+//~^ WARN crate-level attribute should be an inner attribute
+mod no_std {
+ mod inner { #![no_std] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[no_std] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_std] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_std] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_std] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+// At time of authorship, #[proc_macro_derive = "2500"] signals error
+// when it occurs on a mod (apart from crate-level). Therefore it goes
+// into its own file; see issue-43106-gating-of-proc_macro_derive.rs
+
+#[doc = "2400"]
+mod doc {
+ mod inner { #![doc="2400"] }
+
+ #[doc = "2400"] fn f() { }
+
+ #[doc = "2400"] struct S;
+
+ #[doc = "2400"] type T = S;
+
+ #[doc = "2400"] impl S { }
+}
+
+#[cold]
+//~^ WARN attribute should be applied to a function
+//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+mod cold {
+ //~^ NOTE not a function
+
+ mod inner { #![cold] }
+ //~^ WARN attribute should be applied to a function
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function
+
+ #[cold] fn f() { }
+
+ #[cold] struct S;
+ //~^ WARN attribute should be applied to a function
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function
+
+ #[cold] type T = S;
+ //~^ WARN attribute should be applied to a function
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function
+
+ #[cold] impl S { }
+ //~^ WARN attribute should be applied to a function
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function
+}
+
+#[link_name = "1900"]
+//~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+mod link_name {
+ //~^ NOTE not a foreign function or static
+
+ #[link_name = "1900"]
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| HELP try `#[link(name = "1900")]` instead
+ extern "C" { }
+ //~^ NOTE not a foreign function or static
+
+ mod inner { #![link_name="1900"] }
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a foreign function or static
+
+ #[link_name = "1900"] fn f() { }
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a foreign function or static
+
+ #[link_name = "1900"] struct S;
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a foreign function or static
+
+ #[link_name = "1900"] type T = S;
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a foreign function or static
+
+ #[link_name = "1900"] impl S { }
+ //~^ WARN attribute should be applied to a foreign function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a foreign function or static
+}
+
+#[link_section = "1800"]
+//~^ WARN attribute should be applied to a function or static [unused_attributes]
+//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+mod link_section {
+ //~^ NOTE not a function or static
+
+ mod inner { #![link_section="1800"] }
+ //~^ WARN attribute should be applied to a function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function or static
+
+ #[link_section = "1800"] fn f() { }
+
+ #[link_section = "1800"] struct S;
+ //~^ WARN attribute should be applied to a function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function or static
+
+ #[link_section = "1800"] type T = S;
+ //~^ WARN attribute should be applied to a function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function or static
+
+ #[link_section = "1800"] impl S { }
+ //~^ WARN attribute should be applied to a function or static [unused_attributes]
+ //~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ //~| NOTE not a function or static
+}
+
+
+// Note that this is a `check-pass` test, so it will never invoke the linker.
+
+#[link()]
+//~^ WARN attribute should be applied to an `extern` block
+//~| WARN this was previously accepted
+mod link {
+ //~^ NOTE not an `extern` block
+
+ mod inner { #![link()] }
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+ //~| NOTE not an `extern` block
+
+ #[link()] fn f() { }
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+ //~| NOTE not an `extern` block
+
+ #[link()] struct S;
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+ //~| NOTE not an `extern` block
+
+ #[link()] type T = S;
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+ //~| NOTE not an `extern` block
+
+ #[link()] impl S { }
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+ //~| NOTE not an `extern` block
+
+ #[link()] extern "Rust" {}
+ //~^ WARN attribute should be applied to an `extern` block
+ //~| WARN this was previously accepted
+}
+
+struct StructForDeprecated;
+
+#[deprecated]
+mod deprecated {
+ mod inner { #![deprecated] }
+
+ #[deprecated] fn f() { }
+
+ #[deprecated] struct S1;
+
+ #[deprecated] type T = super::StructForDeprecated;
+
+ #[deprecated] impl super::StructForDeprecated { }
+}
+
+#[must_use] //~ WARN `#[must_use]` has no effect
+mod must_use {
+ mod inner { #![must_use] } //~ WARN `#[must_use]` has no effect
+
+ #[must_use] fn f() { }
+
+ #[must_use] struct S;
+
+ #[must_use] type T = S; //~ WARN `#[must_use]` has no effect
+
+ #[must_use] impl S { } //~ WARN `#[must_use]` has no effect
+}
+
+#[windows_subsystem = "windows"]
+//~^ WARN crate-level attribute should be an inner attribute
+mod windows_subsystem {
+ mod inner { #![windows_subsystem="windows"] }
+ //~^ WARN crate-level attribute should be in the root module
+
+ #[windows_subsystem = "windows"] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[windows_subsystem = "windows"] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[windows_subsystem = "windows"] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[windows_subsystem = "windows"] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+// BROKEN USES OF CRATE-LEVEL BUILT-IN ATTRIBUTES
+
+#[crate_name = "0900"]
+//~^ WARN crate-level attribute should be an inner attribute
+mod crate_name {
+ mod inner { #![crate_name="0900"] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[crate_name = "0900"] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_name = "0900"] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_name = "0900"] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_name = "0900"] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+#[crate_type = "0800"]
+//~^ WARN crate-level attribute should be an inner attribute
+mod crate_type {
+ mod inner { #![crate_type="0800"] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[crate_type = "0800"] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_type = "0800"] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_type = "0800"] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[crate_type = "0800"] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+#[feature(x0600)]
+//~^ WARN crate-level attribute should be an inner attribute
+mod feature {
+ mod inner { #![feature(x0600)] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[feature(x0600)] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[feature(x0600)] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[feature(x0600)] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[feature(x0600)] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+
+#[no_main]
+//~^ WARN crate-level attribute should be an inner attribute
+mod no_main_1 {
+ mod inner { #![no_main] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[no_main] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_main] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_main] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_main] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+#[no_builtins]
+//~^ WARN crate-level attribute should be an inner attribute
+mod no_builtins {
+ mod inner { #![no_builtins] }
+ //~^ WARN crate-level attribute should be in the root module
+
+ #[no_builtins] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_builtins] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_builtins] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[no_builtins] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+#[recursion_limit="0200"]
+//~^ WARN crate-level attribute should be an inner attribute
+mod recursion_limit {
+ mod inner { #![recursion_limit="0200"] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[recursion_limit="0200"] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[recursion_limit="0200"] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[recursion_limit="0200"] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[recursion_limit="0200"] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+#[type_length_limit="0100"]
+//~^ WARN crate-level attribute should be an inner attribute
+mod type_length_limit {
+ mod inner { #![type_length_limit="0100"] }
+//~^ WARN crate-level attribute should be in the root module
+
+ #[type_length_limit="0100"] fn f() { }
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[type_length_limit="0100"] struct S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[type_length_limit="0100"] type T = S;
+ //~^ WARN crate-level attribute should be an inner attribute
+
+ #[type_length_limit="0100"] impl S { }
+ //~^ WARN crate-level attribute should be an inner attribute
+}
+
+fn main() {}