2023-01-20 22:09:35 +00:00
|
|
|
use hir::InFile;
|
|
|
|
|
2023-06-14 22:17:22 +00:00
|
|
|
use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
|
2023-01-20 22:09:35 +00:00
|
|
|
|
|
|
|
// Diagnostic: incoherent-impl
|
|
|
|
//
|
|
|
|
// This diagnostic is triggered if the targe type of an impl is from a foreign crate.
|
|
|
|
pub(crate) fn incoherent_impl(ctx: &DiagnosticsContext<'_>, d: &hir::IncoherentImpl) -> Diagnostic {
|
2023-06-14 22:17:22 +00:00
|
|
|
Diagnostic::new_with_syntax_node_ptr(
|
|
|
|
ctx,
|
|
|
|
DiagnosticCode::RustcHardError("E0210"),
|
2024-01-18 12:59:49 +00:00
|
|
|
"cannot define inherent `impl` for foreign type".to_string(),
|
|
|
|
InFile::new(d.file_id, d.impl_.into()),
|
2023-01-20 22:09:35 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod change_case {
|
|
|
|
use crate::tests::check_diagnostics;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn primitive() {
|
|
|
|
check_diagnostics(
|
|
|
|
r#"
|
|
|
|
impl bool {}
|
|
|
|
//^^^^^^^^^^^^ error: cannot define inherent `impl` for foreign type
|
|
|
|
"#,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn primitive_rustc_allow_incoherent_impl() {
|
|
|
|
check_diagnostics(
|
|
|
|
r#"
|
|
|
|
impl bool {
|
|
|
|
#[rustc_allow_incoherent_impl]
|
|
|
|
fn falsch(self) -> Self { false }
|
|
|
|
}
|
|
|
|
"#,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn rustc_allow_incoherent_impl() {
|
|
|
|
check_diagnostics(
|
|
|
|
r#"
|
|
|
|
//- /lib.rs crate:foo
|
|
|
|
#[rustc_has_incoherent_inherent_impls]
|
|
|
|
pub struct S;
|
|
|
|
//- /main.rs crate:main deps:foo
|
|
|
|
impl foo::S {
|
|
|
|
#[rustc_allow_incoherent_impl]
|
|
|
|
fn func(self) {}
|
|
|
|
}
|
|
|
|
"#,
|
|
|
|
);
|
|
|
|
check_diagnostics(
|
|
|
|
r#"
|
|
|
|
//- /lib.rs crate:foo
|
|
|
|
pub struct S;
|
|
|
|
//- /main.rs crate:main deps:foo
|
|
|
|
impl foo::S { #[rustc_allow_incoherent_impl] fn func(self) {} }
|
|
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot define inherent `impl` for foreign type
|
|
|
|
"#,
|
|
|
|
);
|
|
|
|
check_diagnostics(
|
|
|
|
r#"
|
|
|
|
//- /lib.rs crate:foo
|
|
|
|
#[rustc_has_incoherent_inherent_impls]
|
|
|
|
pub struct S;
|
|
|
|
//- /main.rs crate:main deps:foo
|
|
|
|
impl foo::S { fn func(self) {} }
|
|
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot define inherent `impl` for foreign type
|
|
|
|
"#,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|