Skip to content

Commit 1f4b630

Browse files
committed
add auto keyword, parse auto trait, lower to HIR
Adds an `IsAuto` field to `ItemTrait` which flags if the trait was declared as an `auto trait`. Auto traits cannot have generics nor super traits.
1 parent 06506bb commit 1f4b630

File tree

17 files changed

+122
-31
lines changed

17 files changed

+122
-31
lines changed

src/librustc/hir/intravisit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
520520
visitor.visit_id(item.id);
521521
visitor.visit_variant_data(struct_definition, item.name, generics, item.id, item.span);
522522
}
523-
ItemTrait(_, ref generics, ref bounds, ref trait_item_refs) => {
523+
ItemTrait(.., ref generics, ref bounds, ref trait_item_refs) => {
524524
visitor.visit_id(item.id);
525525
visitor.visit_generics(generics);
526526
walk_list!(visitor, visit_ty_param_bound, bounds);

src/librustc/hir/lowering.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ impl<'a> LoweringContext<'a> {
198198
ItemKind::Union(_, ref generics) |
199199
ItemKind::Enum(_, ref generics) |
200200
ItemKind::Ty(_, ref generics) |
201-
ItemKind::Trait(_, ref generics, ..) => {
201+
ItemKind::Trait(_, _, ref generics, ..) => {
202202
let def_id = self.lctx.resolver.definitions().local_def_id(item.id);
203203
let count = generics.lifetimes.len();
204204
self.lctx.type_def_lifetime_params.insert(def_id, count);
@@ -1515,10 +1515,11 @@ impl<'a> LoweringContext<'a> {
15151515
self.lower_ty(ty),
15161516
new_impl_items)
15171517
}
1518-
ItemKind::Trait(unsafety, ref generics, ref bounds, ref items) => {
1518+
ItemKind::Trait(is_auto, unsafety, ref generics, ref bounds, ref items) => {
15191519
let bounds = self.lower_bounds(bounds);
15201520
let items = items.iter().map(|item| self.lower_trait_item_ref(item)).collect();
1521-
hir::ItemTrait(self.lower_unsafety(unsafety),
1521+
hir::ItemTrait(self.lower_is_auto(is_auto),
1522+
self.lower_unsafety(unsafety),
15221523
self.lower_generics(generics),
15231524
bounds,
15241525
items)
@@ -1741,6 +1742,13 @@ impl<'a> LoweringContext<'a> {
17411742
}
17421743
}
17431744

1745+
fn lower_is_auto(&mut self, u: IsAuto) -> hir::IsAuto {
1746+
match u {
1747+
IsAuto::Yes => hir::IsAuto::Yes,
1748+
IsAuto::No => hir::IsAuto::No,
1749+
}
1750+
}
1751+
17441752
fn lower_unsafety(&mut self, u: Unsafety) -> hir::Unsafety {
17451753
match u {
17461754
Unsafety::Unsafe => hir::Unsafety::Unsafe,

src/librustc/hir/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1500,6 +1500,13 @@ pub struct FnDecl {
15001500
pub has_implicit_self: bool,
15011501
}
15021502

1503+
/// Is the trait definition an auto trait?
1504+
#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
1505+
pub enum IsAuto {
1506+
Yes,
1507+
No
1508+
}
1509+
15031510
#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
15041511
pub enum Unsafety {
15051512
Unsafe,
@@ -1811,7 +1818,7 @@ pub enum Item_ {
18111818
/// A union definition, e.g. `union Foo<A, B> {x: A, y: B}`
18121819
ItemUnion(VariantData, Generics),
18131820
/// Represents a Trait Declaration
1814-
ItemTrait(Unsafety, Generics, TyParamBounds, HirVec<TraitItemRef>),
1821+
ItemTrait(IsAuto, Unsafety, Generics, TyParamBounds, HirVec<TraitItemRef>),
18151822

18161823
/// Auto trait implementations
18171824
///

src/librustc/hir/print.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,10 @@ impl<'a> State<'a> {
717717
}
718718
self.bclose(item.span)?;
719719
}
720-
hir::ItemTrait(unsafety, ref generics, ref bounds, ref trait_items) => {
720+
hir::ItemTrait(is_auto, unsafety, ref generics, ref bounds, ref trait_items) => {
721721
self.head("")?;
722722
self.print_visibility(&item.vis)?;
723+
self.print_is_auto(is_auto)?;
723724
self.print_unsafety(unsafety)?;
724725
self.word_nbsp("trait")?;
725726
self.print_name(item.name)?;
@@ -2274,6 +2275,13 @@ impl<'a> State<'a> {
22742275
hir::Unsafety::Unsafe => self.word_nbsp("unsafe"),
22752276
}
22762277
}
2278+
2279+
pub fn print_is_auto(&mut self, s: hir::IsAuto) -> io::Result<()> {
2280+
match s {
2281+
hir::IsAuto::Yes => self.word_nbsp("auto"),
2282+
hir::IsAuto::No => Ok(()),
2283+
}
2284+
}
22772285
}
22782286

22792287
// Dup'ed from parse::classify, but adapted for the HIR.

src/librustc/ich/impls_hir.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ impl_stable_hash_for!(enum hir::Item_ {
944944
ItemEnum(enum_def, generics),
945945
ItemStruct(variant_data, generics),
946946
ItemUnion(variant_data, generics),
947-
ItemTrait(unsafety, generics, bounds, item_refs),
947+
ItemTrait(is_auto, unsafety, generics, bounds, item_refs),
948948
ItemAutoImpl(unsafety, trait_ref),
949949
ItemImpl(unsafety, impl_polarity, impl_defaultness, generics, trait_ref, ty, impl_item_refs)
950950
});
@@ -1126,6 +1126,10 @@ impl_stable_hash_for!(enum hir::Mutability {
11261126
MutImmutable
11271127
});
11281128

1129+
impl_stable_hash_for!(enum hir::IsAuto {
1130+
Yes,
1131+
No
1132+
});
11291133

11301134
impl_stable_hash_for!(enum hir::Unsafety {
11311135
Unsafe,

src/librustc/middle/resolve_lifetime.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
332332
hir::ItemEnum(_, ref generics) |
333333
hir::ItemStruct(_, ref generics) |
334334
hir::ItemUnion(_, ref generics) |
335-
hir::ItemTrait(_, ref generics, ..) |
335+
hir::ItemTrait(_, _, ref generics, ..) |
336336
hir::ItemImpl(_, _, _, ref generics, ..) => {
337337
// These kinds of items have only early bound lifetime parameters.
338338
let mut index = if let hir::ItemTrait(..) = item.node {
@@ -688,7 +688,7 @@ fn compute_object_lifetime_defaults(sess: &Session, hir_map: &Map)
688688
hir::ItemUnion(_, ref generics) |
689689
hir::ItemEnum(_, ref generics) |
690690
hir::ItemTy(_, ref generics) |
691-
hir::ItemTrait(_, ref generics, ..) => {
691+
hir::ItemTrait(_, _, ref generics, ..) => {
692692
let result = object_lifetime_defaults_for_item(hir_map, generics);
693693

694694
// Debugging aid.
@@ -844,7 +844,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
844844
index += 1; // Self comes first.
845845
}
846846
match parent.node {
847-
hir::ItemTrait(_, ref generics, ..) |
847+
hir::ItemTrait(_, _, ref generics, ..) |
848848
hir::ItemImpl(_, _, _, ref generics, ..) => {
849849
index += (generics.lifetimes.len() + generics.ty_params.len()) as u32;
850850
}

src/librustc_lint/builtin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnsafeCode {
228228

229229
fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
230230
match it.node {
231-
hir::ItemTrait(hir::Unsafety::Unsafe, ..) => {
231+
hir::ItemTrait(_, hir::Unsafety::Unsafe, ..) => {
232232
self.report_unsafe(cx, it.span, "declaration of an `unsafe` trait")
233233
}
234234

src/librustc_resolve/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1854,7 +1854,7 @@ impl<'a> Resolver<'a> {
18541854
item.id,
18551855
impl_items),
18561856

1857-
ItemKind::Trait(_, ref generics, ref bounds, ref trait_items) => {
1857+
ItemKind::Trait(.., ref generics, ref bounds, ref trait_items) => {
18581858
// Create a new rib for the trait-wide type parameters.
18591859
self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
18601860
let local_def_id = this.definitions.local_def_id(item.id);

src/librustc_save_analysis/dump_visitor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1232,7 +1232,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tc
12321232
ref impl_items) => {
12331233
self.process_impl(item, ty_params, trait_ref, &typ, impl_items)
12341234
}
1235-
Trait(_, ref generics, ref trait_refs, ref methods) =>
1235+
Trait(_, _, ref generics, ref trait_refs, ref methods) =>
12361236
self.process_trait(item, generics, trait_refs, methods),
12371237
Mod(ref m) => {
12381238
self.process_mod(item);

src/librustc_save_analysis/sig.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,13 @@ impl Sig for ast::Item {
477477
sig.text.push_str(" {}");
478478
Ok(sig)
479479
}
480-
ast::ItemKind::Trait(unsafety, ref generics, ref bounds, _) => {
480+
ast::ItemKind::Trait(is_auto, unsafety, ref generics, ref bounds, _) => {
481481
let mut text = String::new();
482+
483+
if is_auto == ast::IsAuto::Yes {
484+
text.push_str("auto ");
485+
}
486+
482487
if unsafety == ast::Unsafety::Unsafe {
483488
text.push_str("unsafe ");
484489
}

0 commit comments

Comments
 (0)