Rollup merge of #91888 - BoxyUwU:generic_arg_infer_aaaa, r=lcnr
Handle unordered const/ty generics for object lifetime defaults *feel like I should have a PR description but cant think of what to put here* r? ```@lcnr```
This commit is contained in:
commit
6b00227666
@ -52,7 +52,7 @@ use rustc_hir::def::{DefKind, Namespace, PartialRes, PerNS, Res};
|
||||
use rustc_hir::def_id::{DefId, DefPathHash, LocalDefId, CRATE_DEF_ID};
|
||||
use rustc_hir::definitions::{DefKey, DefPathData, Definitions};
|
||||
use rustc_hir::intravisit;
|
||||
use rustc_hir::{ConstArg, GenericArg, InferKind, ParamName};
|
||||
use rustc_hir::{ConstArg, GenericArg, ParamName};
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
use rustc_query_system::ich::StableHashingContext;
|
||||
use rustc_session::lint::builtin::BARE_TRAIT_OBJECTS;
|
||||
@ -1113,7 +1113,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
return GenericArg::Infer(hir::InferArg {
|
||||
hir_id: self.lower_node_id(ty.id),
|
||||
span: self.lower_span(ty.span),
|
||||
kind: InferKind::Type,
|
||||
});
|
||||
}
|
||||
// We parse const arguments as path types as we cannot distinguish them during
|
||||
|
@ -255,23 +255,9 @@ pub struct ConstArg {
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Encodable, Debug, HashStable_Generic)]
|
||||
pub enum InferKind {
|
||||
Const,
|
||||
Type,
|
||||
}
|
||||
|
||||
impl InferKind {
|
||||
#[inline]
|
||||
pub fn is_type(self) -> bool {
|
||||
matches!(self, InferKind::Type)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Encodable, Debug, HashStable_Generic)]
|
||||
pub struct InferArg {
|
||||
pub hir_id: HirId,
|
||||
pub kind: InferKind,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
|
@ -2541,8 +2541,8 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||
GenericParamDefKind::Type { object_lifetime_default, .. } => {
|
||||
Some(object_lifetime_default)
|
||||
}
|
||||
GenericParamDefKind::Lifetime
|
||||
| GenericParamDefKind::Const { .. } => None,
|
||||
GenericParamDefKind::Const { .. } => Some(Set1::Empty),
|
||||
GenericParamDefKind::Lifetime => None,
|
||||
})
|
||||
.collect()
|
||||
})
|
||||
@ -2569,12 +2569,11 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||
}
|
||||
GenericArg::Const(ct) => {
|
||||
self.visit_anon_const(&ct.value);
|
||||
i += 1;
|
||||
}
|
||||
GenericArg::Infer(inf) => {
|
||||
self.visit_id(inf.hir_id);
|
||||
if inf.kind.is_type() {
|
||||
i += 1;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
pub struct Foo<'a, const N: usize, T: 'a + ?Sized>(pub &'a T, [(); N]);
|
@ -0,0 +1,24 @@
|
||||
// aux-build:trait_object_lt_defaults_lib.rs
|
||||
// run-pass
|
||||
#![allow(dead_code)]
|
||||
extern crate trait_object_lt_defaults_lib;
|
||||
|
||||
// Tests that `A<'a, 3, dyn Test>` is short for `A<'a, 3, dyn Test + 'a>`
|
||||
// and `Foo<'a, 3, dyn Test>` is short for `Foo<'a, 3, dyn Test + 'a>`
|
||||
// Test is in `const-generics/defaults` because it relies on param ordering
|
||||
|
||||
trait Test {}
|
||||
|
||||
struct A<'a, const N: usize, T: ?Sized + 'a>(&'a T, [(); N]);
|
||||
fn blah<'a>(mut a: A<'a, 3, dyn Test>, arg: &'a (dyn Test + 'a)) {
|
||||
a.0 = arg;
|
||||
}
|
||||
|
||||
fn other_blah<'a>(
|
||||
mut a: trait_object_lt_defaults_lib::Foo<'a, 3, dyn Test>,
|
||||
arg: &'a (dyn Test + 'a),
|
||||
) {
|
||||
a.0 = arg;
|
||||
}
|
||||
|
||||
fn main() {}
|
Loading…
x
Reference in New Issue
Block a user