]> git.lizzy.rs Git - rust.git/commitdiff
ignore item in thread_local!
authorkyoto7250 <50972773+kyoto7250@users.noreply.github.com>
Thu, 16 Jun 2022 14:19:46 +0000 (23:19 +0900)
committerkyoto7250 <50972773+kyoto7250@users.noreply.github.com>
Sat, 18 Jun 2022 12:02:47 +0000 (21:02 +0900)
clippy_lints/src/non_copy_const.rs
tests/ui/declare_interior_mutable_const/others.rs

index b727105f670fcfe22cbae09eb5832a81a4ec8fff..66b346bea20eaad9469b540d8455700e2bbfd8d3 100644 (file)
@@ -6,6 +6,7 @@
 
 use clippy_utils::diagnostics::span_lint_and_then;
 use clippy_utils::in_constant;
+use clippy_utils::macros::macro_backtrace;
 use if_chain::if_chain;
 use rustc_hir::def::{DefKind, Res};
 use rustc_hir::def_id::DefId;
@@ -17,7 +18,7 @@
 use rustc_middle::ty::adjustment::Adjust;
 use rustc_middle::ty::{self, Const, Ty};
 use rustc_session::{declare_lint_pass, declare_tool_lint};
-use rustc_span::{InnerSpan, Span, DUMMY_SP};
+use rustc_span::{sym, InnerSpan, Span, DUMMY_SP};
 use rustc_typeck::hir_ty_to_ty;
 
 // FIXME: this is a correctness problem but there's no suitable
@@ -250,8 +251,14 @@ 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 is_unfrozen(cx, ty) && is_value_unfrozen_poly(cx, body_id, 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)
+            {
                 lint(cx, Source::Item { item: it.span });
             }
         }
index 48c5e9537d6d088111316151823a6c838e55e5c4..62af545db503b73651a8ea973ce10e830df3c1f4 100644 (file)
@@ -31,4 +31,9 @@ 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) };
+}
+
 fn main() {}