1
Fork 0

Deny non-lifetime generics for test functions.

Previously, these were allowed if the function returned `()`, but always led to an ambiguity error.
This commit is contained in:
Lukas Markeffsky 2023-06-06 23:29:29 +02:00
parent 4bf00613ee
commit 774f7825cb

View file

@ -3,7 +3,7 @@ use crate::errors;
/// Ideally, this code would be in libtest but for efficiency and error messages it lives here. /// Ideally, this code would be in libtest but for efficiency and error messages it lives here.
use crate::util::{check_builtin_macro_attribute, warn_on_duplicate_attribute}; use crate::util::{check_builtin_macro_attribute, warn_on_duplicate_attribute};
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::{self as ast, attr}; use rustc_ast::{self as ast, attr, GenericParamKind};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_expand::base::*; use rustc_expand::base::*;
@ -550,25 +550,22 @@ fn has_test_signature(cx: &ExtCtxt<'_>, i: &ast::Item) -> bool {
return false; return false;
} }
match (has_output, has_should_panic_attr) { if has_should_panic_attr && has_output {
(true, true) => {
sd.span_err(i.span, "functions using `#[should_panic]` must return `()`"); sd.span_err(i.span, "functions using `#[should_panic]` must return `()`");
false return false;
} }
(true, false) => {
if !generics.params.is_empty() { if generics.params.iter().any(|param| !matches!(param.kind, GenericParamKind::Lifetime))
{
sd.span_err( sd.span_err(
i.span, i.span,
"functions used as tests must have signature fn() -> ()", "functions used as tests can not have any non-lifetime generic parameters",
); );
false return false;
} else { }
true true
} }
}
(false, _) => true,
}
}
_ => { _ => {
// should be unreachable because `is_test_fn_item` should catch all non-fn items // should be unreachable because `is_test_fn_item` should catch all non-fn items
debug_assert!(false); debug_assert!(false);