Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ use rustc_session::Session;
use rustc_session::lint::BuiltinLintDiag;
use rustc_session::lint::builtin::{
DEPRECATED_WHERE_CLAUSE_LOCATION, MISSING_ABI, MISSING_UNSAFE_ON_EXTERN,
PATTERNS_IN_FNS_WITHOUT_BODY,
PATTERNS_IN_FNS_WITHOUT_BODY, UNUSED_VISIBILITIES,
};
use rustc_span::{Ident, Span, kw, sym};
use rustc_target::spec::{AbiMap, AbiMapping};
Expand Down Expand Up @@ -1236,14 +1236,25 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
}
});
}
ItemKind::Const(box ConstItem { defaultness, expr, .. }) => {
ItemKind::Const(box ConstItem { defaultness, ident, expr, .. }) => {
self.check_defaultness(item.span, *defaultness);
if expr.is_none() {
self.dcx().emit_err(errors::ConstWithoutBody {
span: item.span,
replace_span: self.ending_semi_or_hi(item.span),
});
}
if ident.name == kw::Underscore
&& !matches!(item.vis.kind, VisibilityKind::Inherited)
{
self.lint_buffer.buffer_lint(
UNUSED_VISIBILITIES,
item.id,
item.vis.span,
BuiltinLintDiag::UnusedVisibility(item.vis.span),
)
}

visit::walk_item(self, item);
}
ItemKind::Static(box StaticItem { expr, safety, .. }) => {
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_lint/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,9 @@ lint_unused_op = unused {$op} that must be used

lint_unused_result = unused result of type `{$ty}`

lint_unused_visibilities = visibility qualifiers have no effect on `const _` declarations
.suggestion = remove the qualifier

lint_use_let_underscore_ignore_suggestion = use `let _ = ...` to ignore the expression or result

lint_useless_ptr_null_checks_fn_ptr = function pointers are not nullable, so checking them for null will always return false
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_lint/src/early/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -361,5 +361,8 @@ pub fn decorate_builtin_lint(
BuiltinLintDiag::OutOfScopeMacroCalls { span, path, location } => {
lints::OutOfScopeMacroCalls { span, path, location }.decorate_lint(diag)
}
BuiltinLintDiag::UnusedVisibility(span) => {
lints::UnusedVisibility { span }.decorate_lint(diag)
}
}
}
1 change: 1 addition & 0 deletions compiler/rustc_lint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ fn register_builtins(store: &mut LintStore) {
"unused",
UNUSED_IMPORTS,
UNUSED_VARIABLES,
UNUSED_VISIBILITIES,
UNUSED_ASSIGNMENTS,
DEAD_CODE,
UNUSED_MUT,
Expand Down
7 changes: 7 additions & 0 deletions compiler/rustc_lint/src/lints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3188,3 +3188,10 @@ impl Subdiagnostic for MismatchedLifetimeSyntaxesSuggestion {
}
}
}

#[derive(LintDiagnostic)]
#[diag(lint_unused_visibilities)]
pub(crate) struct UnusedVisibility {
#[suggestion(style = "short", code = "", applicability = "machine-applicable")]
pub span: Span,
}
21 changes: 21 additions & 0 deletions compiler/rustc_lint_defs/src/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ declare_lint_pass! {
UNUSED_QUALIFICATIONS,
UNUSED_UNSAFE,
UNUSED_VARIABLES,
UNUSED_VISIBILITIES,
USELESS_DEPRECATED,
WARNINGS,
// tidy-alphabetical-end
Expand Down Expand Up @@ -690,6 +691,26 @@ declare_lint! {
"detect variables which are not used in any way"
}

declare_lint! {
/// The `unused_visibilities` lint detects visibility qualifiers (like `pub`)
/// on a `const _` item.
///
/// ### Example
///
/// ```rust
/// pub const _: () = {};
/// ```
///
/// {{produces}}
///
/// ### Explanation
///
/// These qualifiers have no effect, as `const _` items are unnameable.
pub UNUSED_VISIBILITIES,
Warn,
"detect visibility qualifiers on `const _` items"
}

declare_lint! {
/// The `unused_assignments` lint detects assignments that will never be read.
///
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_lint_defs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,7 @@ pub enum BuiltinLintDiag {
path: String,
location: String,
},
UnusedVisibility(Span),
}

pub type RegisteredTools = FxIndexSet<Ident>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ LL | impl<T: core::cmp::Eq> core::fmt::Display for X<T>
| ^^^^^^^^^^^^^^^^^^

error: consider bringing this path into scope with the `use` keyword
--> tests/ui-toml/absolute_paths/absolute_paths.rs:113:14
--> tests/ui-toml/absolute_paths/absolute_paths.rs:113:10
|
LL | pub const _: crate::S = {
| ^^^^^^^^
LL | const _: crate::S = {
| ^^^^^^^^

error: consider bringing this path into scope with the `use` keyword
--> tests/ui-toml/absolute_paths/absolute_paths.rs:114:9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ mod m1 {
}

//~[no_short]v absolute_paths
pub const _: crate::S = {
const _: crate::S = {
let crate::S = m1::S; //~[no_short] absolute_paths

crate::m1::S
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/consts/promoted_const_call3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ pub const C: () = {
//~^ ERROR: destructor of `String` cannot be evaluated at compile-time
};

pub const _: () = {
const _: () = {
let _: &'static _ = &id(&String::new());
//~^ ERROR: destructor of `String` cannot be evaluated at compile-time
};

pub const _: () = {
const _: () = {
let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
//~^ ERROR: temporary value dropped while borrowed
};
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/consts/ptr_is_null.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

const FOO: &usize = &42;

pub const _: () = assert!(!(FOO as *const usize).is_null());
const _: () = assert!(!(FOO as *const usize).is_null());

pub const _: () = assert!(!(42 as *const usize).is_null());
const _: () = assert!(!(42 as *const usize).is_null());

pub const _: () = assert!((0 as *const usize).is_null());
const _: () = assert!((0 as *const usize).is_null());

pub const _: () = assert!(std::ptr::null::<usize>().is_null());
const _: () = assert!(std::ptr::null::<usize>().is_null());

pub const _: () = assert!(!("foo" as *const str).is_null());
const _: () = assert!(!("foo" as *const str).is_null());
Original file line number Diff line number Diff line change
Expand Up @@ -413,3 +413,21 @@ note: the lint level is defined here
LL | #![forbid(forbidden_lint_groups)]
| ^^^^^^^^^^^^^^^^^^^^^

Future breakage diagnostic:
error: warn(unused) incompatible with previous forbid
--> $DIR/issue-70819-dont-override-forbid-in-same-scope.rs:22:13
|
LL | #![forbid(unused)]
| ------ `forbid` level set here
LL | #![deny(unused)]
LL | #![warn(unused)]
| ^^^^^^ overruled by previous forbid
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
note: the lint level is defined here
--> $DIR/issue-70819-dont-override-forbid-in-same-scope.rs:17:11
|
LL | #![forbid(forbidden_lint_groups)]
| ^^^^^^^^^^^^^^^^^^^^^

18 changes: 18 additions & 0 deletions tests/ui/lint/outer-forbid.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -453,3 +453,21 @@ note: the lint level is defined here
LL | #![forbid(forbidden_lint_groups)]
| ^^^^^^^^^^^^^^^^^^^^^

Future breakage diagnostic:
error: allow(unused) incompatible with previous forbid
--> $DIR/outer-forbid.rs:25:9
|
LL | #![forbid(unused, non_snake_case)]
| ------ `forbid` level set here
...
LL | #[allow(unused)]
| ^^^^^^ overruled by previous forbid
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
note: the lint level is defined here
--> $DIR/outer-forbid.rs:18:11
|
LL | #![forbid(forbidden_lint_groups)]
| ^^^^^^^^^^^^^^^^^^^^^

12 changes: 12 additions & 0 deletions tests/ui/lint/unused-visibilities.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//@ check-pass
//@ run-rustfix

#![warn(unused_visibilities)]

const _: () = {};
//~^WARN visibility qualifiers have no effect on `const _` declarations

const _: () = {};
//~^WARN visibility qualifiers have no effect on `const _` declarations

fn main() {}
12 changes: 12 additions & 0 deletions tests/ui/lint/unused-visibilities.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//@ check-pass
//@ run-rustfix

#![warn(unused_visibilities)]

pub const _: () = {};
//~^WARN visibility qualifiers have no effect on `const _` declarations

pub(self) const _: () = {};
//~^WARN visibility qualifiers have no effect on `const _` declarations

fn main() {}
20 changes: 20 additions & 0 deletions tests/ui/lint/unused-visibilities.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
warning: visibility qualifiers have no effect on `const _` declarations
--> $DIR/unused-visibilities.rs:6:1
|
LL | pub const _: () = {};
| ^^^ help: remove the qualifier
|
note: the lint level is defined here
--> $DIR/unused-visibilities.rs:4:9
|
LL | #![warn(unused_visibilities)]
| ^^^^^^^^^^^^^^^^^^^

warning: visibility qualifiers have no effect on `const _` declarations
--> $DIR/unused-visibilities.rs:9:1
|
LL | pub(self) const _: () = {};
| ^^^^^^^^^ help: remove the qualifier

warning: 2 warnings emitted

2 changes: 1 addition & 1 deletion tests/ui/traits/const-traits/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#![feature(const_closures, const_trait_impl)]
#![allow(incomplete_features)]

pub const _: () = {
const _: () = {
assert!((const || true)());
//~^ ERROR }: [const] Fn()` is not satisfied
};
Expand Down
Loading