Skip to content

Commit

Permalink
Rollup merge of #104216 - Nilstrieb:dont-ice-invalid-operator-traits,…
Browse files Browse the repository at this point in the history
… r=estebank

Don't ICE on operator trait methods with generic methods

Emit a fatal error instead.
fixes #104213
  • Loading branch information
Dylan-DPC authored Nov 11, 2022
2 parents f3931c8 + cedaaa6 commit e83b476
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 1 deletion.
3 changes: 3 additions & 0 deletions compiler/rustc_error_messages/locales/en-US/hir_analysis.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,6 @@ hir_analysis_const_bound_for_non_const_trait =
hir_analysis_self_in_impl_self =
`Self` is not valid in the self type of an impl block
.note = replace `Self` with a different type
hir_analysis_op_trait_generic_params =
`{$method_name}` must not have any generic parameters
8 changes: 8 additions & 0 deletions compiler/rustc_hir_typeck/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,11 @@ pub struct AddMissingParenthesesInRange {
#[suggestion_part(code = ")")]
pub right: Span,
}

#[derive(Diagnostic)]
#[diag(hir_analysis_op_trait_generic_params)]
pub struct OpMethodGenericParams {
#[primary_span]
pub span: Span,
pub method_name: String,
}
9 changes: 8 additions & 1 deletion compiler/rustc_hir_typeck/src/method/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ mod suggest;
pub use self::suggest::SelfSource;
pub use self::MethodError::*;

use crate::errors::OpMethodGenericParams;
use crate::{Expectation, FnCtxt};
use rustc_data_structures::sync::Lrc;
use rustc_errors::{Applicability, Diagnostic};
Expand Down Expand Up @@ -443,7 +444,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
};
let def_id = method_item.def_id;
let generics = tcx.generics_of(def_id);
assert_eq!(generics.params.len(), 0);

if generics.params.len() != 0 {
tcx.sess.emit_fatal(OpMethodGenericParams {
span: tcx.def_span(method_item.def_id),
method_name: m_name.to_string(),
});
}

debug!("lookup_in_trait_adjusted: method_item={:?}", method_item);
let mut obligations = vec![];
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/traits/invalid_operator_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#![crate_type = "lib"]
#![feature(lang_items)]
#![feature(no_core)]
#![no_core]

#[lang="sized"]
pub trait Sized {
// Empty.
}

#[lang = "add"]
trait Add<RHS=Self> {
type Output;

fn add<Y>(self, _: RHS) -> Self::Output;
//~^ ERROR `add` must not have any generic parameters
}

#[allow(unreachable_code)]
fn ice(a: usize) {
let r = loop {};
r = r + a;
}
8 changes: 8 additions & 0 deletions src/test/ui/traits/invalid_operator_trait.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: `add` must not have any generic parameters
--> $DIR/invalid_operator_trait.rs:15:5
|
LL | fn add<Y>(self, _: RHS) -> Self::Output;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

0 comments on commit e83b476

Please sign in to comment.