Skip to content

Commit

Permalink
Rollup merge of rust-lang#91888 - BoxyUwU:generic_arg_infer_aaaa, r=lcnr
Browse files Browse the repository at this point in the history
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``
  • Loading branch information
matthiaskrgr committed Dec 15, 2021
2 parents e50ceb5 + 0a0f014 commit 9b1f3de
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 21 deletions.
3 changes: 1 addition & 2 deletions compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,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;
Expand Down Expand Up @@ -1114,7 +1114,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
Expand Down
14 changes: 0 additions & 14 deletions compiler/rustc_hir/src/hir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

Expand Down
9 changes: 4 additions & 5 deletions compiler/rustc_resolve/src/late/lifetimes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
})
Expand All @@ -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;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub struct Foo<'a, const N: usize, T: 'a + ?Sized>(pub &'a T, [(); N]);
24 changes: 24 additions & 0 deletions src/test/ui/const-generics/defaults/trait_object_lt_defaults.rs
Original file line number Diff line number Diff line change
@@ -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() {}

0 comments on commit 9b1f3de

Please sign in to comment.