From 96321ed7564be5264c324a7f815766ec829fd27e Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 7 May 2022 12:41:15 +0200 Subject: [PATCH 1/2] Do not lint on explicit outlives requirements from external macros. --- compiler/rustc_lint/src/builtin.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 3564f15e210ad..eae7df0301b79 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -38,7 +38,7 @@ use rustc_hir::def::{DefKind, Res}; use rustc_hir::def_id::{DefId, LocalDefId, LocalDefIdSet, CRATE_DEF_ID}; use rustc_hir::{ForeignItemKind, GenericParamKind, HirId, PatKind}; use rustc_index::vec::Idx; -use rustc_middle::lint::LintDiagnosticBuilder; +use rustc_middle::lint::{in_external_macro, LintDiagnosticBuilder}; use rustc_middle::ty::layout::{LayoutError, LayoutOf}; use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::subst::{GenericArgKind, Subst}; @@ -2115,6 +2115,7 @@ impl ExplicitOutlivesRequirements { None } }) + .filter(|(_, span)| !in_external_macro(tcx.sess, *span)) .collect() } From 89f15bfd907b0b44a851c5810ab463fe91a206e5 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 7 May 2022 13:08:04 +0200 Subject: [PATCH 2/2] Add test. --- .../edition-lint-infer-outlives-macro.rs | 6 ++++ .../edition-lint-infer-outlives-macro.rs | 28 +++++++++++++++++++ .../edition-lint-infer-outlives-macro.stderr | 14 ++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/test/ui/rust-2018/auxiliary/edition-lint-infer-outlives-macro.rs create mode 100644 src/test/ui/rust-2018/edition-lint-infer-outlives-macro.rs create mode 100644 src/test/ui/rust-2018/edition-lint-infer-outlives-macro.stderr diff --git a/src/test/ui/rust-2018/auxiliary/edition-lint-infer-outlives-macro.rs b/src/test/ui/rust-2018/auxiliary/edition-lint-infer-outlives-macro.rs new file mode 100644 index 0000000000000..d45fa10f022aa --- /dev/null +++ b/src/test/ui/rust-2018/auxiliary/edition-lint-infer-outlives-macro.rs @@ -0,0 +1,6 @@ +pub fn foo() {} + +#[macro_export] +macro_rules! gimme_a { + ($($mac:tt)*) => { $($mac)* { 'a } } +} diff --git a/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.rs b/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.rs new file mode 100644 index 0000000000000..d7a832831c1d9 --- /dev/null +++ b/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.rs @@ -0,0 +1,28 @@ +// edition:2018 +// aux-build:edition-lint-infer-outlives-macro.rs + +// Test that the lint does not fire if the where predicate +// is from the local crate, but all the bounds are from an +// external macro. + +#![deny(explicit_outlives_requirements)] + +#[macro_use] +extern crate edition_lint_infer_outlives_macro; + +macro_rules! make_foo { + ($a:tt) => { + struct Foo<$a, 'b> where 'b: $a { + foo: &$a &'b (), + } + } +} + +gimme_a! {make_foo!} + +struct Bar<'a, 'b: 'a> { + //~^ ERROR: outlives requirements can be inferred + bar: &'a &'b (), +} + +fn main() {} diff --git a/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.stderr b/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.stderr new file mode 100644 index 0000000000000..553b1cd976ad6 --- /dev/null +++ b/src/test/ui/rust-2018/edition-lint-infer-outlives-macro.stderr @@ -0,0 +1,14 @@ +error: outlives requirements can be inferred + --> $DIR/edition-lint-infer-outlives-macro.rs:23:18 + | +LL | struct Bar<'a, 'b: 'a> { + | ^^^^ help: remove this bound + | +note: the lint level is defined here + --> $DIR/edition-lint-infer-outlives-macro.rs:8:9 + | +LL | #![deny(explicit_outlives_requirements)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error +