Auto merge of #117817 - fmease:deny-more-tilde-const, r=fee1-dead · rust-lang/rust@a04d56b (original) (raw)

`@@ -40,6 +40,9 @@ enum SelfSemantic {

`

40

40

`enum DisallowTildeConstContext<'a> {

`

41

41

`TraitObject,

`

42

42

`Fn(FnKind<'a>),

`

``

43

`+

Trait(Span),

`

``

44

`+

Impl(Span),

`

``

45

`+

Item,

`

43

46

`}

`

44

47

``

45

48

`struct AstValidator<'a> {

`

`@@ -110,18 +113,6 @@ impl<'a> AstValidator<'a> {

`

110

113

`self.disallow_tilde_const = old;

`

111

114

`}

`

112

115

``

113

``

`-

fn with_tilde_const_allowed(&mut self, f: impl FnOnce(&mut Self)) {

`

114

``

`-

self.with_tilde_const(None, f)

`

115

``

`-

}

`

116

``

-

117

``

`-

fn with_banned_tilde_const(

`

118

``

`-

&mut self,

`

119

``

`-

ctx: DisallowTildeConstContext<'a>,

`

120

``

`-

f: impl FnOnce(&mut Self),

`

121

``

`-

) {

`

122

``

`-

self.with_tilde_const(Some(ctx), f)

`

123

``

`-

}

`

124

``

-

125

116

`fn check_type_alias_where_clause_location(

`

126

117

`&mut self,

`

127

118

`ty_alias: &TyAlias,

`

`@@ -173,7 +164,7 @@ impl<'a> AstValidator<'a> {

`

173

164

`self.with_impl_trait(Some(t.span), |this| visit::walk_ty(this, t))

`

174

165

`}

`

175

166

`TyKind::TraitObject(..) => self

`

176

``

`-

.with_banned_tilde_const(DisallowTildeConstContext::TraitObject, |this| {

`

``

167

`+

.with_tilde_const(Some(DisallowTildeConstContext::TraitObject), |this| {

`

177

168

` visit::walk_ty(this, t)

`

178

169

`}),

`

179

170

`TyKind::Path(qself, path) => {

`

`@@ -845,11 +836,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

845

836

``

846

837

` this.visit_vis(&item.vis);

`

847

838

` this.visit_ident(item.ident);

`

848

``

`-

if let Const::Yes(_) = constness {

`

849

``

`-

this.with_tilde_const_allowed(|this| this.visit_generics(generics));

`

850

``

`-

} else {

`

851

``

`-

this.visit_generics(generics);

`

852

``

`-

}

`

``

839

`+

let disallowed = matches!(constness, Const::No)

`

``

840

`+

.then(|| DisallowTildeConstContext::Impl(item.span));

`

``

841

`+

this.with_tilde_const(disallowed, |this| this.visit_generics(generics));

`

853

842

` this.visit_trait_ref(t);

`

854

843

` this.visit_ty(self_ty);

`

855

844

``

`@@ -863,10 +852,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

863

852

` polarity,

`

864

853

` defaultness,

`

865

854

` constness,

`

866

``

`-

generics: _,

`

``

855

`+

generics,

`

867

856

`of_trait: None,

`

868

857

` self_ty,

`

869

``

`-

items: _,

`

``

858

`+

items,

`

870

859

`}) => {

`

871

860

`let error =

`

872

861

` |annotation_span, annotation, only_trait: bool| errors::InherentImplCannot {

`

`@@ -898,6 +887,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

898

887

`if let &Const::Yes(span) = constness {

`

899

888

`` self.err_handler().emit_err(error(span, "const", true));

``

900

889

`}

`

``

890

+

``

891

`+

self.visit_vis(&item.vis);

`

``

892

`+

self.visit_ident(item.ident);

`

``

893

`+

self.with_tilde_const(None, |this| this.visit_generics(generics));

`

``

894

`+

self.visit_ty(self_ty);

`

``

895

`+

walk_list!(self, visit_assoc_item, items, AssocCtxt::Impl);

`

``

896

`+

walk_list!(self, visit_attribute, &item.attrs);

`

``

897

`+

return; // Avoid visiting again.

`

901

898

`}

`

902

899

`ItemKind::Fn(box Fn { defaultness, sig, generics, body }) => {

`

903

900

`self.check_defaultness(item.span, *defaultness);

`

`@@ -978,8 +975,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

978

975

`// context for the supertraits.

`

979

976

` this.visit_vis(&item.vis);

`

980

977

` this.visit_ident(item.ident);

`

981

``

`-

this.visit_generics(generics);

`

982

``

`-

this.with_tilde_const_allowed(|this| {

`

``

978

`+

let disallowed =

`

``

979

`+

(!is_const_trait).then(|| DisallowTildeConstContext::Trait(item.span));

`

``

980

`+

this.with_tilde_const(disallowed, |this| {

`

``

981

`+

this.visit_generics(generics);

`

983

982

`walk_list!(this, visit_param_bound, bounds, BoundKind::SuperTraits)

`

984

983

`});

`

985

984

`walk_list!(this, visit_assoc_item, items, AssocCtxt::Trait);

`

`@@ -999,16 +998,11 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

999

998

`}

`

1000

999

`}

`

1001

1000

`ItemKind::Struct(vdata, generics) => match vdata {

`

1002

``

`` -

// Duplicating the Visitor logic allows catching all cases

``

1003

``

`` -

// of Anonymous(Struct, Union) outside of a field struct or union.

``

1004

``

`-

//

`

1005

``

`` -

// Inside visit_ty the validator catches every Anonymous(Struct, Union) it

``

1006

``

`` -

// encounters, and only on ItemKind::Struct and ItemKind::Union

``

1007

``

`` -

// it uses visit_ty_common, which doesn't contain that specific check.

``

1008

1001

`VariantData::Struct(fields, ..) => {

`

1009

1002

`self.visit_vis(&item.vis);

`

1010

1003

`self.visit_ident(item.ident);

`

1011

1004

`self.visit_generics(generics);

`

``

1005

`` +

// Permit Anon{Struct,Union} as field type.

``

1012

1006

`walk_list!(self, visit_struct_field_def, fields);

`

1013

1007

`walk_list!(self, visit_attribute, &item.attrs);

`

1014

1008

`return;

`

`@@ -1024,6 +1018,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

1024

1018

`self.visit_vis(&item.vis);

`

1025

1019

`self.visit_ident(item.ident);

`

1026

1020

`self.visit_generics(generics);

`

``

1021

`` +

// Permit Anon{Struct,Union} as field type.

``

1027

1022

`walk_list!(self, visit_struct_field_def, fields);

`

1028

1023

`walk_list!(self, visit_attribute, &item.attrs);

`

1029

1024

`return;

`

`@@ -1212,15 +1207,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

1212

1207

`if let Some(reason) = &self.disallow_tilde_const =>

`

1213

1208

`{

`

1214

1209

`let reason = match reason {

`

1215

``

`-

DisallowTildeConstContext::TraitObject => {

`

1216

``

`-

errors::TildeConstReason::TraitObject

`

1217

``

`-

}

`

1218

1210

`DisallowTildeConstContext::Fn(FnKind::Closure(..)) => {

`

1219

1211

` errors::TildeConstReason::Closure

`

1220

1212

`}

`

1221

1213

`DisallowTildeConstContext::Fn(FnKind::Fn(_, ident, ..)) => {

`

1222

1214

` errors::TildeConstReason::Function { ident: ident.span }

`

1223

1215

`}

`

``

1216

`+

&DisallowTildeConstContext::Trait(span) => errors::TildeConstReason::Trait { span },

`

``

1217

`+

&DisallowTildeConstContext::Impl(span) => errors::TildeConstReason::Impl { span },

`

``

1218

`+

DisallowTildeConstContext::TraitObject => {

`

``

1219

`+

errors::TildeConstReason::TraitObject

`

``

1220

`+

}

`

``

1221

`+

DisallowTildeConstContext::Item => errors::TildeConstReason::Item,

`

1224

1222

`};

`

1225

1223

`self.err_handler()

`

1226

1224

`.emit_err(errors::TildeConstDisallowed { span: bound.span(), reason });

`

`@@ -1328,7 +1326,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

1328

1326

` || matches!(fk.ctxt(), Some(FnCtxt::Assoc(_)) if self.in_const_trait_or_impl);

`

1329

1327

``

1330

1328

`let disallowed = (!tilde_const_allowed).then(|| DisallowTildeConstContext::Fn(fk));

`

1331

``

-

1332

1329

`self.with_tilde_const(disallowed, |this| visit::walk_fn(this, fk));

`

1333

1330

`}

`

1334

1331

``

`@@ -1397,18 +1394,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {

`

1397

1394

`}

`

1398

1395

``

1399

1396

`match &item.kind {

`

1400

``

`-

AssocItemKind::Type(box TyAlias { generics, bounds, ty, .. })

`

1401

``

`-

if ctxt == AssocCtxt::Trait =>

`

1402

``

`-

{

`

1403

``

`-

self.visit_vis(&item.vis);

`

1404

``

`-

self.visit_ident(item.ident);

`

1405

``

`-

walk_list!(self, visit_attribute, &item.attrs);

`

1406

``

`-

self.with_tilde_const_allowed(|this| {

`

1407

``

`-

this.visit_generics(generics);

`

1408

``

`-

walk_list!(this, visit_param_bound, bounds, BoundKind::Bound);

`

1409

``

`-

});

`

1410

``

`-

walk_list!(self, visit_ty, ty);

`

1411

``

`-

}

`

1412

1397

`AssocItemKind::Fn(box Fn { sig, generics, body, .. })

`

1413

1398

`if self.in_const_trait_or_impl

`

1414

1399

` || ctxt == AssocCtxt::Trait

`

`@@ -1552,7 +1537,7 @@ pub fn check_crate(

`

1552

1537

`in_const_trait_or_impl: false,

`

1553

1538

`has_proc_macro_decls: false,

`

1554

1539

`outer_impl_trait: None,

`

1555

``

`-

disallow_tilde_const: None,

`

``

1540

`+

disallow_tilde_const: Some(DisallowTildeConstContext::Item),

`

1556

1541

`is_impl_trait_banned: false,

`

1557

1542

`lint_buffer: lints,

`

1558

1543

`};

`