Skip to content

Commit 887feee

Browse files
committed
rustc: replace GenericArgs::with_generic_args hack with a plain getter.
1 parent e79b2a1 commit 887feee

File tree

6 files changed

+91
-102
lines changed

6 files changed

+91
-102
lines changed

src/librustc/hir/mod.rs

+7-11
Original file line numberDiff line numberDiff line change
@@ -383,17 +383,13 @@ impl PathSegment {
383383
}
384384
}
385385

386-
// FIXME: hack required because you can't create a static
387-
// `GenericArgs`, so you can't just return a `&GenericArgs`.
388-
pub fn with_generic_args<F, R>(&self, f: F) -> R
389-
where F: FnOnce(&GenericArgs) -> R
390-
{
391-
let dummy = GenericArgs::none();
392-
f(if let Some(ref args) = self.args {
393-
&args
386+
pub fn generic_args(&self) -> &GenericArgs {
387+
if let Some(ref args) = self.args {
388+
args
394389
} else {
395-
&dummy
396-
})
390+
const DUMMY: &GenericArgs = &GenericArgs::none();
391+
DUMMY
392+
}
397393
}
398394
}
399395

@@ -449,7 +445,7 @@ pub struct GenericArgs {
449445
}
450446

451447
impl GenericArgs {
452-
pub fn none() -> Self {
448+
pub const fn none() -> Self {
453449
Self {
454450
args: HirVec::new(),
455451
bindings: HirVec::new(),

src/librustc/hir/print.rs

+19-30
Original file line numberDiff line numberDiff line change
@@ -1194,12 +1194,11 @@ impl<'a> State<'a> {
11941194
self.s.word(".")?;
11951195
self.print_ident(segment.ident)?;
11961196

1197-
segment.with_generic_args(|generic_args| {
1198-
if !generic_args.args.is_empty() || !generic_args.bindings.is_empty() {
1199-
return self.print_generic_args(&generic_args, segment.infer_args, true);
1200-
}
1201-
Ok(())
1202-
})?;
1197+
let generic_args = segment.generic_args();
1198+
if !generic_args.args.is_empty() || !generic_args.bindings.is_empty() {
1199+
self.print_generic_args(generic_args, segment.infer_args, true)?;
1200+
}
1201+
12031202
self.print_call_post(base_args)
12041203
}
12051204

@@ -1559,11 +1558,9 @@ impl<'a> State<'a> {
15591558
self.s.word("::")?
15601559
}
15611560
if segment.ident.name != kw::PathRoot {
1562-
self.print_ident(segment.ident)?;
1563-
segment.with_generic_args(|generic_args| {
1564-
self.print_generic_args(generic_args, segment.infer_args,
1565-
colons_before_params)
1566-
})?;
1561+
self.print_ident(segment.ident)?;
1562+
self.print_generic_args(segment.generic_args(), segment.infer_args,
1563+
colons_before_params)?;
15671564
}
15681565
}
15691566

@@ -1572,10 +1569,8 @@ impl<'a> State<'a> {
15721569

15731570
pub fn print_path_segment(&mut self, segment: &hir::PathSegment) -> io::Result<()> {
15741571
if segment.ident.name != kw::PathRoot {
1575-
self.print_ident(segment.ident)?;
1576-
segment.with_generic_args(|generic_args| {
1577-
self.print_generic_args(generic_args, segment.infer_args, false)
1578-
})?;
1572+
self.print_ident(segment.ident)?;
1573+
self.print_generic_args(segment.generic_args(), segment.infer_args, false)?;
15791574
}
15801575
Ok(())
15811576
}
@@ -1600,35 +1595,29 @@ impl<'a> State<'a> {
16001595
}
16011596
if segment.ident.name != kw::PathRoot {
16021597
self.print_ident(segment.ident)?;
1603-
segment.with_generic_args(|generic_args| {
1604-
self.print_generic_args(generic_args,
1605-
segment.infer_args,
1606-
colons_before_params)
1607-
})?;
1598+
self.print_generic_args(segment.generic_args(),
1599+
segment.infer_args,
1600+
colons_before_params)?;
16081601
}
16091602
}
16101603

16111604
self.s.word(">")?;
16121605
self.s.word("::")?;
16131606
let item_segment = path.segments.last().unwrap();
16141607
self.print_ident(item_segment.ident)?;
1615-
item_segment.with_generic_args(|generic_args| {
1616-
self.print_generic_args(generic_args,
1617-
item_segment.infer_args,
1618-
colons_before_params)
1619-
})
1608+
self.print_generic_args(item_segment.generic_args(),
1609+
item_segment.infer_args,
1610+
colons_before_params)
16201611
}
16211612
hir::QPath::TypeRelative(ref qself, ref item_segment) => {
16221613
self.s.word("<")?;
16231614
self.print_type(qself)?;
16241615
self.s.word(">")?;
16251616
self.s.word("::")?;
16261617
self.print_ident(item_segment.ident)?;
1627-
item_segment.with_generic_args(|generic_args| {
1628-
self.print_generic_args(generic_args,
1629-
item_segment.infer_args,
1630-
colons_before_params)
1631-
})
1618+
self.print_generic_args(item_segment.generic_args(),
1619+
item_segment.infer_args,
1620+
colons_before_params)
16321621
}
16331622
}
16341623
}

src/librustc_typeck/astconv.rs

+50-56
Original file line numberDiff line numberDiff line change
@@ -191,15 +191,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
191191
item_segment: &hir::PathSegment)
192192
-> SubstsRef<'tcx>
193193
{
194-
let (substs, assoc_bindings, _) = item_segment.with_generic_args(|generic_args| {
195-
self.create_substs_for_ast_path(
196-
span,
197-
def_id,
198-
generic_args,
199-
item_segment.infer_args,
200-
None,
201-
)
202-
});
194+
let (substs, assoc_bindings, _) = self.create_substs_for_ast_path(
195+
span,
196+
def_id,
197+
item_segment.generic_args(),
198+
item_segment.infer_args,
199+
None,
200+
);
203201

204202
assoc_bindings.first().map(|b| Self::prohibit_assoc_ty_binding(self.tcx(), b.span));
205203

@@ -874,8 +872,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
874872
let trait_def = self.tcx().trait_def(trait_def_id);
875873

876874
if !self.tcx().features().unboxed_closures &&
877-
trait_segment.with_generic_args(|generic_args| generic_args.parenthesized)
878-
!= trait_def.paren_sugar {
875+
trait_segment.generic_args().parenthesized != trait_def.paren_sugar
876+
{
879877
// For now, require that parenthetical notation be used only with `Fn()` etc.
880878
let msg = if trait_def.paren_sugar {
881879
"the precise format of `Fn`-family traits' type parameters is subject to change. \
@@ -887,13 +885,11 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
887885
span, GateIssue::Language, msg);
888886
}
889887

890-
trait_segment.with_generic_args(|generic_args| {
891-
self.create_substs_for_ast_path(span,
892-
trait_def_id,
893-
generic_args,
894-
trait_segment.infer_args,
895-
Some(self_ty))
896-
})
888+
self.create_substs_for_ast_path(span,
889+
trait_def_id,
890+
trait_segment.generic_args(),
891+
trait_segment.infer_args,
892+
Some(self_ty))
897893
}
898894

899895
fn trait_defines_associated_type_named(&self,
@@ -1765,47 +1761,45 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
17651761
&self, segments: T) -> bool {
17661762
let mut has_err = false;
17671763
for segment in segments {
1768-
segment.with_generic_args(|generic_args| {
1769-
let (mut err_for_lt, mut err_for_ty, mut err_for_ct) = (false, false, false);
1770-
for arg in &generic_args.args {
1771-
let (span, kind) = match arg {
1772-
hir::GenericArg::Lifetime(lt) => {
1773-
if err_for_lt { continue }
1774-
err_for_lt = true;
1775-
has_err = true;
1776-
(lt.span, "lifetime")
1777-
}
1778-
hir::GenericArg::Type(ty) => {
1779-
if err_for_ty { continue }
1780-
err_for_ty = true;
1781-
has_err = true;
1782-
(ty.span, "type")
1783-
}
1784-
hir::GenericArg::Const(ct) => {
1785-
if err_for_ct { continue }
1786-
err_for_ct = true;
1787-
(ct.span, "const")
1788-
}
1789-
};
1790-
let mut err = struct_span_err!(
1791-
self.tcx().sess,
1792-
span,
1793-
E0109,
1794-
"{} arguments are not allowed for this type",
1795-
kind,
1796-
);
1797-
err.span_label(span, format!("{} argument not allowed", kind));
1798-
err.emit();
1799-
if err_for_lt && err_for_ty && err_for_ct {
1800-
break;
1764+
let (mut err_for_lt, mut err_for_ty, mut err_for_ct) = (false, false, false);
1765+
for arg in &segment.generic_args().args {
1766+
let (span, kind) = match arg {
1767+
hir::GenericArg::Lifetime(lt) => {
1768+
if err_for_lt { continue }
1769+
err_for_lt = true;
1770+
has_err = true;
1771+
(lt.span, "lifetime")
18011772
}
1802-
}
1803-
for binding in &generic_args.bindings {
1804-
has_err = true;
1805-
Self::prohibit_assoc_ty_binding(self.tcx(), binding.span);
1773+
hir::GenericArg::Type(ty) => {
1774+
if err_for_ty { continue }
1775+
err_for_ty = true;
1776+
has_err = true;
1777+
(ty.span, "type")
1778+
}
1779+
hir::GenericArg::Const(ct) => {
1780+
if err_for_ct { continue }
1781+
err_for_ct = true;
1782+
(ct.span, "const")
1783+
}
1784+
};
1785+
let mut err = struct_span_err!(
1786+
self.tcx().sess,
1787+
span,
1788+
E0109,
1789+
"{} arguments are not allowed for this type",
1790+
kind,
1791+
);
1792+
err.span_label(span, format!("{} argument not allowed", kind));
1793+
err.emit();
1794+
if err_for_lt && err_for_ty && err_for_ct {
18061795
break;
18071796
}
1808-
})
1797+
}
1798+
for binding in &segment.generic_args().bindings {
1799+
has_err = true;
1800+
Self::prohibit_assoc_ty_binding(self.tcx(), binding.span);
1801+
break;
1802+
}
18091803
}
18101804
has_err
18111805
}

src/librustdoc/clean/mod.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2809,7 +2809,8 @@ impl Clean<Type> for hir::Ty {
28092809
let mut ty_substs = FxHashMap::default();
28102810
let mut lt_substs = FxHashMap::default();
28112811
let mut ct_substs = FxHashMap::default();
2812-
provided_params.with_generic_args(|generic_args| {
2812+
let generic_args = provided_params.generic_args();
2813+
{
28132814
let mut indices: GenericParamCount = Default::default();
28142815
for param in generics.params.iter() {
28152816
match param.kind {
@@ -2884,7 +2885,7 @@ impl Clean<Type> for hir::Ty {
28842885
}
28852886
}
28862887
}
2887-
});
2888+
}
28882889
return cx.enter_alias(ty_substs, lt_substs, ct_substs, || ty.clean(cx));
28892890
}
28902891
resolve_type(cx, path.clean(cx), self.hir_id)
@@ -3537,7 +3538,7 @@ impl Clean<PathSegment> for hir::PathSegment {
35373538
fn clean(&self, cx: &DocContext<'_>) -> PathSegment {
35383539
PathSegment {
35393540
name: self.ident.name.clean(cx),
3540-
args: self.with_generic_args(|generic_args| generic_args.clean(cx))
3541+
args: self.generic_args().clean(cx),
35413542
}
35423543
}
35433544
}

src/libsyntax/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#![deny(unused_lifetimes)]
1313

1414
#![feature(bind_by_move_pattern_guards)]
15+
#![feature(const_fn)]
16+
#![feature(const_transmute)]
1517
#![feature(crate_visibility_modifier)]
1618
#![feature(label_break_value)]
1719
#![feature(nll)]

src/libsyntax/ptr.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,15 @@ impl<T: Encodable> Encodable for P<T> {
133133
}
134134

135135
impl<T> P<[T]> {
136-
pub fn new() -> P<[T]> {
137-
P { ptr: Default::default() }
136+
pub const fn new() -> P<[T]> {
137+
// HACK(eddyb) bypass the lack of a `const fn` to create an empty `Box<[T]>`
138+
// (as trait methods, `default` in this case, can't be `const fn` yet).
139+
P {
140+
ptr: unsafe {
141+
use std::ptr::NonNull;
142+
std::mem::transmute(NonNull::<[T; 0]>::dangling() as NonNull<[T]>)
143+
},
144+
}
138145
}
139146

140147
#[inline(never)]

0 commit comments

Comments
 (0)