Skip to content

Commit 7bc7be8

Browse files
committed
Auto merge of rust-lang#87648 - JulianKnodt:const_eq_constrain, r=oli-obk
allow eq constraints on associated constants Updates rust-lang#70256 (cc `@varkor,` `@Centril)`
2 parents 7531d2f + b77bb5c commit 7bc7be8

File tree

83 files changed

+776
-382
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+776
-382
lines changed

Cargo.lock

+9-45
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ dependencies = [
335335
"cargo-test-macro",
336336
"cargo-test-support",
337337
"cargo-util",
338-
"clap 3.0.6",
338+
"clap",
339339
"crates-io",
340340
"crossbeam-utils",
341341
"curl",
@@ -615,28 +615,13 @@ dependencies = [
615615
"ansi_term 0.12.1",
616616
"atty",
617617
"bitflags",
618-
"strsim 0.8.0",
619-
"textwrap 0.11.0",
618+
"strsim",
619+
"textwrap",
620620
"unicode-width",
621621
"vec_map",
622622
"yaml-rust 0.3.5",
623623
]
624624

625-
[[package]]
626-
name = "clap"
627-
version = "3.0.6"
628-
source = "registry+https://github.com/rust-lang/crates.io-index"
629-
checksum = "1957aa4a5fb388f0a0a73ce7556c5b42025b874e5cdc2c670775e346e97adec0"
630-
dependencies = [
631-
"atty",
632-
"bitflags",
633-
"indexmap",
634-
"os_str_bytes",
635-
"strsim 0.10.0",
636-
"termcolor",
637-
"textwrap 0.14.2",
638-
]
639-
640625
[[package]]
641626
name = "clippy"
642627
version = "0.1.60"
@@ -669,7 +654,7 @@ version = "0.0.1"
669654
dependencies = [
670655
"bytecount",
671656
"cargo_metadata 0.14.0",
672-
"clap 2.34.0",
657+
"clap",
673658
"indoc",
674659
"itertools 0.10.1",
675660
"opener",
@@ -1751,7 +1736,7 @@ name = "installer"
17511736
version = "0.0.0"
17521737
dependencies = [
17531738
"anyhow",
1754-
"clap 2.34.0",
1739+
"clap",
17551740
"flate2",
17561741
"lazy_static",
17571742
"num_cpus",
@@ -2190,7 +2175,7 @@ dependencies = [
21902175
"ammonia",
21912176
"anyhow",
21922177
"chrono",
2193-
"clap 2.34.0",
2178+
"clap",
21942179
"elasticlunr-rs",
21952180
"env_logger 0.7.1",
21962181
"handlebars",
@@ -2521,15 +2506,6 @@ dependencies = [
25212506
"winapi",
25222507
]
25232508

2524-
[[package]]
2525-
name = "os_str_bytes"
2526-
version = "6.0.0"
2527-
source = "registry+https://github.com/rust-lang/crates.io-index"
2528-
checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
2529-
dependencies = [
2530-
"memchr",
2531-
]
2532-
25332509
[[package]]
25342510
name = "output_vt100"
25352511
version = "0.1.2"
@@ -2934,7 +2910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
29342910
checksum = "b0b4b5faaf07040474e8af74a9e19ff167d5d204df5db5c5c765edecfb900358"
29352911
dependencies = [
29362912
"bitflags",
2937-
"clap 2.34.0",
2913+
"clap",
29382914
"derive_more",
29392915
"env_logger 0.7.1",
29402916
"humantime 2.0.1",
@@ -3282,7 +3258,7 @@ dependencies = [
32823258
name = "rustbook"
32833259
version = "0.1.0"
32843260
dependencies = [
3285-
"clap 2.34.0",
3261+
"clap",
32863262
"env_logger 0.7.1",
32873263
"mdbook",
32883264
]
@@ -4898,19 +4874,13 @@ version = "0.8.0"
48984874
source = "registry+https://github.com/rust-lang/crates.io-index"
48994875
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
49004876

4901-
[[package]]
4902-
name = "strsim"
4903-
version = "0.10.0"
4904-
source = "registry+https://github.com/rust-lang/crates.io-index"
4905-
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
4906-
49074877
[[package]]
49084878
name = "structopt"
49094879
version = "0.3.25"
49104880
source = "registry+https://github.com/rust-lang/crates.io-index"
49114881
checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c"
49124882
dependencies = [
4913-
"clap 2.34.0",
4883+
"clap",
49144884
"lazy_static",
49154885
"structopt-derive",
49164886
]
@@ -5081,12 +5051,6 @@ dependencies = [
50815051
"unicode-width",
50825052
]
50835053

5084-
[[package]]
5085-
name = "textwrap"
5086-
version = "0.14.2"
5087-
source = "registry+https://github.com/rust-lang/crates.io-index"
5088-
checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
5089-
50905054
[[package]]
50915055
name = "thiserror"
50925056
version = "1.0.30"

compiler/rustc_ast/src/ast.rs

+26-7
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ pub enum AngleBracketedArg {
224224
/// Argument for a generic parameter.
225225
Arg(GenericArg),
226226
/// Constraint for an associated item.
227-
Constraint(AssocTyConstraint),
227+
Constraint(AssocConstraint),
228228
}
229229

230230
impl AngleBracketedArg {
@@ -1843,19 +1843,38 @@ impl UintTy {
18431843
/// A constraint on an associated type (e.g., `A = Bar` in `Foo<A = Bar>` or
18441844
/// `A: TraitA + TraitB` in `Foo<A: TraitA + TraitB>`).
18451845
#[derive(Clone, Encodable, Decodable, Debug)]
1846-
pub struct AssocTyConstraint {
1846+
pub struct AssocConstraint {
18471847
pub id: NodeId,
18481848
pub ident: Ident,
18491849
pub gen_args: Option<GenericArgs>,
1850-
pub kind: AssocTyConstraintKind,
1850+
pub kind: AssocConstraintKind,
18511851
pub span: Span,
18521852
}
18531853

1854-
/// The kinds of an `AssocTyConstraint`.
1854+
/// The kinds of an `AssocConstraint`.
18551855
#[derive(Clone, Encodable, Decodable, Debug)]
1856-
pub enum AssocTyConstraintKind {
1857-
/// E.g., `A = Bar` in `Foo<A = Bar>`.
1858-
Equality { ty: P<Ty> },
1856+
pub enum Term {
1857+
Ty(P<Ty>),
1858+
Const(AnonConst),
1859+
}
1860+
1861+
impl From<P<Ty>> for Term {
1862+
fn from(v: P<Ty>) -> Self {
1863+
Term::Ty(v)
1864+
}
1865+
}
1866+
1867+
impl From<AnonConst> for Term {
1868+
fn from(v: AnonConst) -> Self {
1869+
Term::Const(v)
1870+
}
1871+
}
1872+
1873+
/// The kinds of an `AssocConstraint`.
1874+
#[derive(Clone, Encodable, Decodable, Debug)]
1875+
pub enum AssocConstraintKind {
1876+
/// E.g., `A = Bar`, `A = 3` in `Foo<A = Bar>` where A is an associated type.
1877+
Equality { term: Term },
18591878
/// E.g. `A: TraitA + TraitB` in `Foo<A: TraitA + TraitB>`.
18601879
Bound { bounds: GenericBounds },
18611880
}

compiler/rustc_ast/src/mut_visit.rs

+10-11
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ pub trait MutVisitor: Sized {
165165
noop_visit_lifetime(l, self);
166166
}
167167

168-
fn visit_ty_constraint(&mut self, t: &mut AssocTyConstraint) {
169-
noop_visit_ty_constraint(t, self);
168+
fn visit_constraint(&mut self, t: &mut AssocConstraint) {
169+
noop_visit_constraint(t, self);
170170
}
171171

172172
fn visit_foreign_mod(&mut self, nm: &mut ForeignMod) {
@@ -430,8 +430,8 @@ pub fn noop_flat_map_arm<T: MutVisitor>(mut arm: Arm, vis: &mut T) -> SmallVec<[
430430
smallvec![arm]
431431
}
432432

433-
pub fn noop_visit_ty_constraint<T: MutVisitor>(
434-
AssocTyConstraint { id, ident, gen_args, kind, span }: &mut AssocTyConstraint,
433+
pub fn noop_visit_constraint<T: MutVisitor>(
434+
AssocConstraint { id, ident, gen_args, kind, span }: &mut AssocConstraint,
435435
vis: &mut T,
436436
) {
437437
vis.visit_id(id);
@@ -440,12 +440,11 @@ pub fn noop_visit_ty_constraint<T: MutVisitor>(
440440
vis.visit_generic_args(gen_args);
441441
}
442442
match kind {
443-
AssocTyConstraintKind::Equality { ref mut ty } => {
444-
vis.visit_ty(ty);
445-
}
446-
AssocTyConstraintKind::Bound { ref mut bounds } => {
447-
visit_bounds(bounds, vis);
448-
}
443+
AssocConstraintKind::Equality { ref mut term } => match term {
444+
Term::Ty(ty) => vis.visit_ty(ty),
445+
Term::Const(c) => vis.visit_anon_const(c),
446+
},
447+
AssocConstraintKind::Bound { ref mut bounds } => visit_bounds(bounds, vis),
449448
}
450449
vis.visit_span(span);
451450
}
@@ -555,7 +554,7 @@ pub fn noop_visit_angle_bracketed_parameter_data<T: MutVisitor>(
555554
let AngleBracketedArgs { args, span } = data;
556555
visit_vec(args, |arg| match arg {
557556
AngleBracketedArg::Arg(arg) => vis.visit_generic_arg(arg),
558-
AngleBracketedArg::Constraint(constraint) => vis.visit_ty_constraint(constraint),
557+
AngleBracketedArg::Constraint(constraint) => vis.visit_constraint(constraint),
559558
});
560559
vis.visit_span(span);
561560
}

compiler/rustc_ast/src/visit.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ pub trait Visitor<'ast>: Sized {
190190
fn visit_generic_arg(&mut self, generic_arg: &'ast GenericArg) {
191191
walk_generic_arg(self, generic_arg)
192192
}
193-
fn visit_assoc_ty_constraint(&mut self, constraint: &'ast AssocTyConstraint) {
194-
walk_assoc_ty_constraint(self, constraint)
193+
fn visit_assoc_constraint(&mut self, constraint: &'ast AssocConstraint) {
194+
walk_assoc_constraint(self, constraint)
195195
}
196196
fn visit_attribute(&mut self, attr: &'ast Attribute) {
197197
walk_attribute(self, attr)
@@ -464,7 +464,7 @@ where
464464
for arg in &data.args {
465465
match arg {
466466
AngleBracketedArg::Arg(a) => visitor.visit_generic_arg(a),
467-
AngleBracketedArg::Constraint(c) => visitor.visit_assoc_ty_constraint(c),
467+
AngleBracketedArg::Constraint(c) => visitor.visit_assoc_constraint(c),
468468
}
469469
}
470470
}
@@ -486,19 +486,17 @@ where
486486
}
487487
}
488488

489-
pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>(
490-
visitor: &mut V,
491-
constraint: &'a AssocTyConstraint,
492-
) {
489+
pub fn walk_assoc_constraint<'a, V: Visitor<'a>>(visitor: &mut V, constraint: &'a AssocConstraint) {
493490
visitor.visit_ident(constraint.ident);
494491
if let Some(ref gen_args) = constraint.gen_args {
495492
visitor.visit_generic_args(gen_args.span(), gen_args);
496493
}
497494
match constraint.kind {
498-
AssocTyConstraintKind::Equality { ref ty } => {
499-
visitor.visit_ty(ty);
500-
}
501-
AssocTyConstraintKind::Bound { ref bounds } => {
495+
AssocConstraintKind::Equality { ref term } => match term {
496+
Term::Ty(ty) => visitor.visit_ty(ty),
497+
Term::Const(c) => visitor.visit_anon_const(c),
498+
},
499+
AssocConstraintKind::Bound { ref bounds } => {
502500
walk_list!(visitor, visit_param_bound, bounds);
503501
}
504502
}

compiler/rustc_ast_lowering/src/lib.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
960960
/// returns a `hir::TypeBinding` representing `Item`.
961961
fn lower_assoc_ty_constraint(
962962
&mut self,
963-
constraint: &AssocTyConstraint,
963+
constraint: &AssocConstraint,
964964
mut itctx: ImplTraitContext<'_, 'hir>,
965965
) -> hir::TypeBinding<'hir> {
966966
debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
@@ -997,10 +997,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
997997
};
998998

999999
let kind = match constraint.kind {
1000-
AssocTyConstraintKind::Equality { ref ty } => {
1001-
hir::TypeBindingKind::Equality { ty: self.lower_ty(ty, itctx) }
1000+
AssocConstraintKind::Equality { ref term } => {
1001+
let term = match term {
1002+
Term::Ty(ref ty) => self.lower_ty(ty, itctx).into(),
1003+
Term::Const(ref c) => self.lower_anon_const(c).into(),
1004+
};
1005+
hir::TypeBindingKind::Equality { term }
10021006
}
1003-
AssocTyConstraintKind::Bound { ref bounds } => {
1007+
AssocConstraintKind::Bound { ref bounds } => {
10041008
let mut capturable_lifetimes;
10051009
let mut parent_def_id = self.current_hir_id_owner;
10061010
// Piggy-back on the `impl Trait` context to figure out the correct behavior.
@@ -1078,7 +1082,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
10781082
itctx,
10791083
);
10801084

1081-
hir::TypeBindingKind::Equality { ty }
1085+
hir::TypeBindingKind::Equality { term: ty.into() }
10821086
})
10831087
} else {
10841088
// Desugar `AssocTy: Bounds` into a type binding where the

compiler/rustc_ast_lowering/src/path.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
420420
ty: &'hir hir::Ty<'hir>,
421421
) -> hir::TypeBinding<'hir> {
422422
let ident = Ident::with_dummy_span(hir::FN_OUTPUT_NAME);
423-
let kind = hir::TypeBindingKind::Equality { ty };
423+
let kind = hir::TypeBindingKind::Equality { term: ty.into() };
424424
let args = arena_vec![self;];
425425
let bindings = arena_vec![self;];
426426
let gen_args = self.arena.alloc(hir::GenericArgs {

compiler/rustc_ast_passes/src/ast_validation.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ impl<'a> AstValidator<'a> {
138138
self.outer_impl_trait = old;
139139
}
140140

141-
fn visit_assoc_ty_constraint_from_generic_args(&mut self, constraint: &'a AssocTyConstraint) {
141+
fn visit_assoc_constraint_from_generic_args(&mut self, constraint: &'a AssocConstraint) {
142142
match constraint.kind {
143-
AssocTyConstraintKind::Equality { .. } => {}
144-
AssocTyConstraintKind::Bound { .. } => {
143+
AssocConstraintKind::Equality { .. } => {}
144+
AssocConstraintKind::Bound { .. } => {
145145
if self.is_assoc_ty_bound_banned {
146146
self.err_handler().span_err(
147147
constraint.span,
@@ -150,7 +150,7 @@ impl<'a> AstValidator<'a> {
150150
}
151151
}
152152
}
153-
self.visit_assoc_ty_constraint(constraint);
153+
self.visit_assoc_constraint(constraint);
154154
}
155155

156156
// Mirrors `visit::walk_ty`, but tracks relevant state.
@@ -1277,7 +1277,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
12771277
// are allowed to contain nested `impl Trait`.
12781278
AngleBracketedArg::Constraint(constraint) => {
12791279
self.with_impl_trait(None, |this| {
1280-
this.visit_assoc_ty_constraint_from_generic_args(constraint);
1280+
this.visit_assoc_constraint_from_generic_args(constraint);
12811281
});
12821282
}
12831283
}
@@ -1586,12 +1586,12 @@ fn deny_equality_constraints(
15861586
let len = assoc_path.segments.len() - 1;
15871587
let gen_args = args.as_ref().map(|p| (**p).clone());
15881588
// Build `<Bar = RhsTy>`.
1589-
let arg = AngleBracketedArg::Constraint(AssocTyConstraint {
1589+
let arg = AngleBracketedArg::Constraint(AssocConstraint {
15901590
id: rustc_ast::node_id::DUMMY_NODE_ID,
15911591
ident: *ident,
15921592
gen_args,
1593-
kind: AssocTyConstraintKind::Equality {
1594-
ty: predicate.rhs_ty.clone(),
1593+
kind: AssocConstraintKind::Equality {
1594+
term: predicate.rhs_ty.clone().into(),
15951595
},
15961596
span: ident.span,
15971597
});

0 commit comments

Comments
 (0)