Auto merge of #116782 - matthiaskrgr:rollup-t3yrgku, r=matthiaskrgr
Rollup of 3 pull requests Successful merges: - #115196 (Suggest adding `return` if the for semi which can coerce to the fn return type) - #115955 (Stabilize `{IpAddr, Ipv6Addr}::to_canonical`) - #116776 (Enable `review-requested` feature for rustbot) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
9ace9da2e0
9 changed files with 249 additions and 22 deletions
|
@ -507,6 +507,7 @@ pub enum StashKey {
|
||||||
CallAssocMethod,
|
CallAssocMethod,
|
||||||
TraitMissingMethod,
|
TraitMissingMethod,
|
||||||
OpaqueHiddenTypeMismatch,
|
OpaqueHiddenTypeMismatch,
|
||||||
|
MaybeForgetReturn,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_track_diagnostic(d: &mut Diagnostic, f: &mut dyn FnMut(&mut Diagnostic)) {
|
fn default_track_diagnostic(d: &mut Diagnostic, f: &mut dyn FnMut(&mut Diagnostic)) {
|
||||||
|
|
|
@ -564,7 +564,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
if !errors.is_empty() {
|
if !errors.is_empty() {
|
||||||
self.adjust_fulfillment_errors_for_expr_obligation(&mut errors);
|
self.adjust_fulfillment_errors_for_expr_obligation(&mut errors);
|
||||||
|
let errors_causecode = errors
|
||||||
|
.iter()
|
||||||
|
.map(|e| (e.obligation.cause.span, e.root_obligation.cause.code().clone()))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
self.err_ctxt().report_fulfillment_errors(errors);
|
self.err_ctxt().report_fulfillment_errors(errors);
|
||||||
|
self.collect_unused_stmts_for_coerce_return_ty(errors_causecode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::{
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, Applicability, Diagnostic, DiagnosticId, ErrorGuaranteed, MultiSpan,
|
pluralize, Applicability, Diagnostic, DiagnosticId, ErrorGuaranteed, MultiSpan, StashKey,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorOf, DefKind, Res};
|
||||||
|
@ -27,6 +27,7 @@ use rustc_infer::infer::error_reporting::{FailureCode, ObligationCauseExt};
|
||||||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||||
use rustc_infer::infer::TypeTrace;
|
use rustc_infer::infer::TypeTrace;
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
||||||
|
use rustc_middle::traits::ObligationCauseCode::ExprBindingObligation;
|
||||||
use rustc_middle::ty::adjustment::AllowTwoPhase;
|
use rustc_middle::ty::adjustment::AllowTwoPhase;
|
||||||
use rustc_middle::ty::visit::TypeVisitableExt;
|
use rustc_middle::ty::visit::TypeVisitableExt;
|
||||||
use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt};
|
use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt};
|
||||||
|
@ -1375,7 +1376,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
_ => bug!("unexpected type: {:?}", ty.normalized),
|
_ => bug!("unexpected type: {:?}", ty.normalized),
|
||||||
},
|
},
|
||||||
Res::Def(DefKind::Struct | DefKind::Union | DefKind::TyAlias | DefKind::AssocTy, _)
|
Res::Def(
|
||||||
|
DefKind::Struct | DefKind::Union | DefKind::TyAlias { .. } | DefKind::AssocTy,
|
||||||
|
_,
|
||||||
|
)
|
||||||
| Res::SelfTyParam { .. }
|
| Res::SelfTyParam { .. }
|
||||||
| Res::SelfTyAlias { .. } => match ty.normalized.ty_adt_def() {
|
| Res::SelfTyAlias { .. } => match ty.normalized.ty_adt_def() {
|
||||||
Some(adt) if !adt.is_enum() => {
|
Some(adt) if !adt.is_enum() => {
|
||||||
|
@ -1845,6 +1849,55 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(super) fn collect_unused_stmts_for_coerce_return_ty(
|
||||||
|
&self,
|
||||||
|
errors_causecode: Vec<(Span, ObligationCauseCode<'tcx>)>,
|
||||||
|
) {
|
||||||
|
for (span, code) in errors_causecode {
|
||||||
|
let Some(mut diag) =
|
||||||
|
self.tcx.sess.diagnostic().steal_diagnostic(span, StashKey::MaybeForgetReturn)
|
||||||
|
else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(fn_sig) = self.body_fn_sig()
|
||||||
|
&& let ExprBindingObligation(_, _, hir_id, ..) = code
|
||||||
|
&& !fn_sig.output().is_unit()
|
||||||
|
{
|
||||||
|
let mut block_num = 0;
|
||||||
|
let mut found_semi = false;
|
||||||
|
for (_, node) in self.tcx.hir().parent_iter(hir_id) {
|
||||||
|
match node {
|
||||||
|
hir::Node::Stmt(stmt) => if let hir::StmtKind::Semi(ref expr) = stmt.kind {
|
||||||
|
let expr_ty = self.typeck_results.borrow().expr_ty(expr);
|
||||||
|
let return_ty = fn_sig.output();
|
||||||
|
if !matches!(expr.kind, hir::ExprKind::Ret(..)) &&
|
||||||
|
self.can_coerce(expr_ty, return_ty) {
|
||||||
|
found_semi = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hir::Node::Block(_block) => if found_semi {
|
||||||
|
block_num += 1;
|
||||||
|
}
|
||||||
|
hir::Node::Item(item) => if let hir::ItemKind::Fn(..) = item.kind {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if block_num > 1 && found_semi {
|
||||||
|
diag.span_suggestion_verbose(
|
||||||
|
span.shrink_to_lo(),
|
||||||
|
"you might have meant to return this to infer its type parameters",
|
||||||
|
"return ",
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diag.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Given a vector of fulfillment errors, try to adjust the spans of the
|
/// Given a vector of fulfillment errors, try to adjust the spans of the
|
||||||
/// errors to more accurately point at the cause of the failure.
|
/// errors to more accurately point at the cause of the failure.
|
||||||
///
|
///
|
||||||
|
|
|
@ -17,7 +17,7 @@ use crate::traits::{
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
||||||
MultiSpan, Style,
|
MultiSpan, StashKey, Style,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Namespace, Res};
|
use rustc_hir::def::{DefKind, Namespace, Res};
|
||||||
|
@ -2049,14 +2049,14 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
// begin with in those cases.
|
// begin with in those cases.
|
||||||
if self.tcx.lang_items().sized_trait() == Some(trait_ref.def_id()) {
|
if self.tcx.lang_items().sized_trait() == Some(trait_ref.def_id()) {
|
||||||
if let None = self.tainted_by_errors() {
|
if let None = self.tainted_by_errors() {
|
||||||
self.emit_inference_failure_err(
|
let err = self.emit_inference_failure_err(
|
||||||
obligation.cause.body_id,
|
obligation.cause.body_id,
|
||||||
span,
|
span,
|
||||||
trait_ref.self_ty().skip_binder().into(),
|
trait_ref.self_ty().skip_binder().into(),
|
||||||
ErrorCode::E0282,
|
ErrorCode::E0282,
|
||||||
false,
|
false,
|
||||||
)
|
);
|
||||||
.emit();
|
err.stash(span, StashKey::MaybeForgetReturn);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,9 +412,12 @@ impl IpAddr {
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// #![feature(ip)]
|
|
||||||
/// use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
/// use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||||
///
|
///
|
||||||
|
/// let localhost_v4 = Ipv4Addr::new(127, 0, 0, 1);
|
||||||
|
///
|
||||||
|
/// assert_eq!(IpAddr::V4(localhost_v4).to_canonical(), localhost_v4);
|
||||||
|
/// assert_eq!(IpAddr::V6(localhost_v4.to_ipv6_mapped()).to_canonical(), localhost_v4);
|
||||||
/// assert_eq!(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)).to_canonical().is_loopback(), true);
|
/// assert_eq!(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)).to_canonical().is_loopback(), true);
|
||||||
/// assert_eq!(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1)).is_loopback(), false);
|
/// assert_eq!(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1)).is_loopback(), false);
|
||||||
/// assert_eq!(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1)).to_canonical().is_loopback(), true);
|
/// assert_eq!(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1)).to_canonical().is_loopback(), true);
|
||||||
|
@ -422,11 +425,11 @@ impl IpAddr {
|
||||||
#[inline]
|
#[inline]
|
||||||
#[must_use = "this returns the result of the operation, \
|
#[must_use = "this returns the result of the operation, \
|
||||||
without modifying the original"]
|
without modifying the original"]
|
||||||
#[rustc_const_unstable(feature = "const_ip", issue = "76205")]
|
#[stable(feature = "ip_to_canonical", since = "CURRENT_RUSTC_VERSION")]
|
||||||
#[unstable(feature = "ip", issue = "27709")]
|
#[rustc_const_stable(feature = "ip_to_canonical", since = "CURRENT_RUSTC_VERSION")]
|
||||||
pub const fn to_canonical(&self) -> IpAddr {
|
pub const fn to_canonical(&self) -> IpAddr {
|
||||||
match self {
|
match self {
|
||||||
&v4 @ IpAddr::V4(_) => v4,
|
IpAddr::V4(_) => *self,
|
||||||
IpAddr::V6(v6) => v6.to_canonical(),
|
IpAddr::V6(v6) => v6.to_canonical(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1750,11 +1753,11 @@ impl Ipv6Addr {
|
||||||
/// Some(Ipv4Addr::new(192, 10, 2, 255)));
|
/// Some(Ipv4Addr::new(192, 10, 2, 255)));
|
||||||
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).to_ipv4_mapped(), None);
|
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).to_ipv4_mapped(), None);
|
||||||
/// ```
|
/// ```
|
||||||
#[rustc_const_unstable(feature = "const_ipv6", issue = "76205")]
|
#[inline]
|
||||||
#[stable(feature = "ipv6_to_ipv4_mapped", since = "1.63.0")]
|
|
||||||
#[must_use = "this returns the result of the operation, \
|
#[must_use = "this returns the result of the operation, \
|
||||||
without modifying the original"]
|
without modifying the original"]
|
||||||
#[inline]
|
#[stable(feature = "ipv6_to_ipv4_mapped", since = "1.63.0")]
|
||||||
|
#[rustc_const_stable(feature = "const_ipv6_to_ipv4_mapped", since = "CURRENT_RUSTC_VERSION")]
|
||||||
pub const fn to_ipv4_mapped(&self) -> Option<Ipv4Addr> {
|
pub const fn to_ipv4_mapped(&self) -> Option<Ipv4Addr> {
|
||||||
match self.octets() {
|
match self.octets() {
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, a, b, c, d] => {
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, a, b, c, d] => {
|
||||||
|
@ -1819,11 +1822,11 @@ impl Ipv6Addr {
|
||||||
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1).is_loopback(), false);
|
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1).is_loopback(), false);
|
||||||
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1).to_canonical().is_loopback(), true);
|
/// assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x7f00, 0x1).to_canonical().is_loopback(), true);
|
||||||
/// ```
|
/// ```
|
||||||
#[rustc_const_unstable(feature = "const_ipv6", issue = "76205")]
|
#[inline]
|
||||||
#[unstable(feature = "ip", issue = "27709")]
|
|
||||||
#[must_use = "this returns the result of the operation, \
|
#[must_use = "this returns the result of the operation, \
|
||||||
without modifying the original"]
|
without modifying the original"]
|
||||||
#[inline]
|
#[stable(feature = "ip_to_canonical", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
#[rustc_const_stable(feature = "ip_to_canonical", since = "CURRENT_RUSTC_VERSION")]
|
||||||
pub const fn to_canonical(&self) -> IpAddr {
|
pub const fn to_canonical(&self) -> IpAddr {
|
||||||
if let Some(mapped) = self.to_ipv4_mapped() {
|
if let Some(mapped) = self.to_ipv4_mapped() {
|
||||||
return IpAddr::V4(mapped);
|
return IpAddr::V4(mapped);
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
struct MyError;
|
||||||
|
|
||||||
|
fn foo(x: bool) -> Result<(), MyError> {
|
||||||
|
if x {
|
||||||
|
Err(MyError);
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bar(x: bool) -> Result<(), MyError> {
|
||||||
|
if x {
|
||||||
|
Ok(());
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn baz(x: bool) -> Result<(), MyError> {
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
if x {
|
||||||
|
1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(MyError);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn error() -> Result<(), MyError> {
|
||||||
|
Err(MyError)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bak(x: bool) -> Result<(), MyError> {
|
||||||
|
if x {
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
error();
|
||||||
|
} else {
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bad(x: bool) -> Result<(), MyError> {
|
||||||
|
Err(MyError); //~ ERROR type annotations needed
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn with_closure<F, A, B>(_: F) -> i32
|
||||||
|
where
|
||||||
|
F: FnOnce(A, B),
|
||||||
|
{
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn a() -> i32 {
|
||||||
|
with_closure(|x: u32, y| {}); //~ ERROR type annotations needed
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,98 @@
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:5:9
|
||||||
|
|
|
||||||
|
LL | Err(MyError);
|
||||||
|
| ^^^ cannot infer type of the type parameter `T` declared on the enum `Result`
|
||||||
|
|
|
||||||
|
help: consider specifying the generic arguments
|
||||||
|
|
|
||||||
|
LL | Err::<T, MyError>(MyError);
|
||||||
|
| ++++++++++++++
|
||||||
|
help: you might have meant to return this to infer its type parameters
|
||||||
|
|
|
||||||
|
LL | return Err(MyError);
|
||||||
|
| ++++++
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:14:9
|
||||||
|
|
|
||||||
|
LL | Ok(());
|
||||||
|
| ^^ cannot infer type of the type parameter `E` declared on the enum `Result`
|
||||||
|
|
|
||||||
|
help: consider specifying the generic arguments
|
||||||
|
|
|
||||||
|
LL | Ok::<(), E>(());
|
||||||
|
| +++++++++
|
||||||
|
help: you might have meant to return this to infer its type parameters
|
||||||
|
|
|
||||||
|
LL | return Ok(());
|
||||||
|
| ++++++
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:21:20
|
||||||
|
|
|
||||||
|
LL | fn baz(x: bool) -> Result<(), MyError> {
|
||||||
|
| --- ^^^^^^^^^^^^^^^^^^^ expected `Result<(), MyError>`, found `()`
|
||||||
|
| |
|
||||||
|
| implicitly returns `()` as its body has no tail or `return` expression
|
||||||
|
...
|
||||||
|
LL | Err(MyError);
|
||||||
|
| - help: remove this semicolon to return this value
|
||||||
|
|
|
||||||
|
= note: expected enum `Result<(), MyError>`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:35:10
|
||||||
|
|
|
||||||
|
LL | if x {
|
||||||
|
| __________^
|
||||||
|
LL | |
|
||||||
|
LL | | error();
|
||||||
|
| | - help: remove this semicolon to return this value
|
||||||
|
LL | | } else {
|
||||||
|
| |_____^ expected `Result<(), MyError>`, found `()`
|
||||||
|
|
|
||||||
|
= note: expected enum `Result<(), MyError>`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:38:12
|
||||||
|
|
|
||||||
|
LL | } else {
|
||||||
|
| ____________^
|
||||||
|
LL | |
|
||||||
|
LL | | error();
|
||||||
|
| | - help: remove this semicolon to return this value
|
||||||
|
LL | | }
|
||||||
|
| |_____^ expected `Result<(), MyError>`, found `()`
|
||||||
|
|
|
||||||
|
= note: expected enum `Result<(), MyError>`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:45:5
|
||||||
|
|
|
||||||
|
LL | Err(MyError);
|
||||||
|
| ^^^ cannot infer type of the type parameter `T` declared on the enum `Result`
|
||||||
|
|
|
||||||
|
help: consider specifying the generic arguments
|
||||||
|
|
|
||||||
|
LL | Err::<T, MyError>(MyError);
|
||||||
|
| ++++++++++++++
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-86094-suggest-add-return-to-coerce-ret-ty.rs:57:27
|
||||||
|
|
|
||||||
|
LL | with_closure(|x: u32, y| {});
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: consider giving this closure parameter an explicit type
|
||||||
|
|
|
||||||
|
LL | with_closure(|x: u32, y: /* Type */| {});
|
||||||
|
| ++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0282, E0308.
|
||||||
|
For more information about an error, try `rustc --explain E0282`.
|
|
@ -8,12 +8,6 @@ LL | #![feature(specialization)]
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
|
||||||
--> $DIR/specialization-unconstrained.rs:14:22
|
|
||||||
|
|
|
||||||
LL | default type Id = T;
|
|
||||||
| ^ cannot infer type for associated type `<T as Default>::Id`
|
|
||||||
|
|
||||||
error[E0284]: type annotations needed: cannot satisfy `<u32 as Default>::Id == ()`
|
error[E0284]: type annotations needed: cannot satisfy `<u32 as Default>::Id == ()`
|
||||||
--> $DIR/specialization-unconstrained.rs:20:5
|
--> $DIR/specialization-unconstrained.rs:20:5
|
||||||
|
|
|
|
||||||
|
@ -26,6 +20,12 @@ note: required by a bound in `test`
|
||||||
LL | fn test<T: Default<Id = U>, U>() {}
|
LL | fn test<T: Default<Id = U>, U>() {}
|
||||||
| ^^^^^^ required by this bound in `test`
|
| ^^^^^^ required by this bound in `test`
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/specialization-unconstrained.rs:14:22
|
||||||
|
|
|
||||||
|
LL | default type Id = T;
|
||||||
|
| ^ cannot infer type for associated type `<T as Default>::Id`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
error: aborting due to 2 previous errors; 1 warning emitted
|
||||||
|
|
||||||
Some errors have detailed explanations: E0282, E0284.
|
Some errors have detailed explanations: E0282, E0284.
|
||||||
|
|
|
@ -29,6 +29,12 @@ reviewed_label = "S-waiting-on-author"
|
||||||
# These labels are removed when a "request changes" review is submitted.
|
# These labels are removed when a "request changes" review is submitted.
|
||||||
review_labels = ["S-waiting-on-review"]
|
review_labels = ["S-waiting-on-review"]
|
||||||
|
|
||||||
|
[review-requested]
|
||||||
|
# Those labels are removed when PR author requests a review from an assignee
|
||||||
|
remove_labels = ["S-waiting-on-author"]
|
||||||
|
# Those labels are added when PR author requests a review from an assignee
|
||||||
|
add_labels = ["S-waiting-on-review"]
|
||||||
|
|
||||||
[glacier]
|
[glacier]
|
||||||
|
|
||||||
[ping.icebreakers-llvm]
|
[ping.icebreakers-llvm]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue