1
Fork 0

Rollup merge of #96812 - cjgillot:no-lint-outllives-macro, r=petrochenkov

Do not lint on explicit outlives requirements from external macros.

The current implementation of the list rightfully skipped where predicates from external macros.
However, if the where predicate came from the current macro but the bounds were from an external macro, the lint still fired.

Closes https://github.com/rust-lang/rust/issues/96640
This commit is contained in:
Dylan DPC 2022-05-10 08:24:03 +02:00 committed by GitHub
commit 7b32e9304b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 1 deletions

View file

@ -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, PredicateOrigin};
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()
}

View file

@ -0,0 +1,6 @@
pub fn foo() {}
#[macro_export]
macro_rules! gimme_a {
($($mac:tt)*) => { $($mac)* { 'a } }
}

View file

@ -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() {}

View file

@ -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