]> git.lizzy.rs Git - rust.git/commitdiff
check macro statements in non_copy_const.rs
authorkyoto7250 <50972773+kyoto7250@users.noreply.github.com>
Mon, 25 Jul 2022 12:41:12 +0000 (21:41 +0900)
committerkyoto7250 <50972773+kyoto7250@users.noreply.github.com>
Mon, 25 Jul 2022 13:28:49 +0000 (22:28 +0900)
Cargo.toml
clippy_lints/src/non_copy_const.rs
tests/ui/declare_interior_mutable_const/others.rs
tests/ui/declare_interior_mutable_const/others.stderr

index 69deaca0b4b8e9f5827dd99dad7b52948c0fb3ac..699e68b86f7665bdf422499367aaa42294f9e5b4 100644 (file)
@@ -52,7 +52,7 @@ serde = { version = "1.0.125", features = ["derive"] }
 syn = { version = "1.0", features = ["full"] }
 futures = "0.3"
 parking_lot = "0.12"
-tokio = { version = "1", features = ["io-util"] }
+tokio = { version = "1", features = ["full"] }
 rustc-semver = "1.1"
 
 [build-dependencies]
index 6bce5fbd4c1fecf24cb1144fa812569186834f26..72c86f28bbc6c4e4193894a6cbf4dedf09f2ea54 100644 (file)
@@ -251,14 +251,7 @@ impl<'tcx> LateLintPass<'tcx> for NonCopyConst {
     fn check_item(&mut self, cx: &LateContext<'tcx>, it: &'tcx Item<'_>) {
         if let ItemKind::Const(hir_ty, body_id) = it.kind {
             let ty = hir_ty_to_ty(cx.tcx, hir_ty);
-            if !macro_backtrace(it.span).last().map_or(false, |macro_call| {
-                matches!(
-                    cx.tcx.get_diagnostic_name(macro_call.def_id),
-                    Some(sym::thread_local_macro)
-                )
-            }) && is_unfrozen(cx, ty)
-                && is_value_unfrozen_poly(cx, body_id, ty)
-            {
+            if !ignored_macro(cx, it) && is_unfrozen(cx, ty) && is_value_unfrozen_poly(cx, body_id, ty) {
                 lint(cx, Source::Item { item: it.span });
             }
         }
@@ -445,3 +438,12 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
         }
     }
 }
+
+fn ignored_macro(cx: &LateContext<'_>, it: &rustc_hir::Item<'_>) -> bool {
+    macro_backtrace(it.span).any(|macro_call| {
+        matches!(
+            cx.tcx.get_diagnostic_name(macro_call.def_id),
+            Some(sym::thread_local_macro)
+        )
+    })
+}
index 62af545db503b73651a8ea973ce10e830df3c1f4..f46d3499f4e9100f8b28d6640129438fb6775281 100644 (file)
@@ -31,9 +31,30 @@ macro_rules! declare_const {
 static STATIC_TUPLE: (AtomicUsize, String) = (ATOMIC, STRING);
 //^ there should be no lints on this line
 
-// issue #8493
-thread_local! {
-    static THREAD_LOCAL: Cell<i32> = const { Cell::new(0) };
+mod issue_8493 {
+    use std::cell::Cell;
+
+    // https://github.com/rust-lang/rust-clippy/issues/9224
+    tokio::task_local! {
+        pub static _FOO: String;
+    }
+
+    thread_local! {
+        static _BAR: Cell<i32> = const { Cell::new(0) };
+    }
+
+    macro_rules! issue_8493 {
+        () => {
+            const _BAZ: Cell<usize> = Cell::new(0); //~ ERROR interior mutable
+            static _FOOBAR: () = {
+                thread_local! {
+                    static _VAR: Cell<i32> = const { Cell::new(0) };
+                }
+            };
+        };
+    }
+
+    issue_8493!();
 }
 
 fn main() {}
index fd0689dfc4c99db4dbc8dce74d0b2d3566e97e10..6cba9491ef4e8d1b6d30b78e1c48e9cea61a01c4 100644 (file)
@@ -35,5 +35,16 @@ LL | declare_const!(_ONCE: Once = Once::new()); //~ ERROR interior mutable
    |
    = note: this error originates in the macro `declare_const` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 4 previous errors
+error: a `const` item should never be interior mutable
+  --> $DIR/others.rs:48:13
+   |
+LL |             const _BAZ: Cell<usize> = Cell::new(0); //~ ERROR interior mutable
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL |     issue_8493!();
+   |     ------------- in this macro invocation
+   |
+   = note: this error originates in the macro `issue_8493` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 5 previous errors