Skip to content

Commit 715811d

Browse files
committed
support default impl for specialization
pr review
1 parent b0fca5f commit 715811d

File tree

22 files changed

+202
-65
lines changed

22 files changed

+202
-65
lines changed

rls

Submodule rls updated from 016cbc5 to 6ecff95

src/doc/reference

src/grammar/parser-lalr.y

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ extern char *yytext;
8989
%token TRAIT
9090
%token TYPE
9191
%token UNSAFE
92+
%token DEFAULT
9293
%token USE
9394
%token WHILE
9495
%token CONTINUE
@@ -534,6 +535,11 @@ maybe_unsafe
534535
| %empty { $$ = mk_none(); }
535536
;
536537

538+
maybe_default_impl
539+
: IMPL { $$ = mk_none(); }
540+
| DEFAULT IMPL { $$ = $1 }
541+
;
542+
537543
trait_method
538544
: type_method { $$ = mk_node("Required", 1, $1); }
539545
| method { $$ = mk_node("Provided", 1, $1); }
@@ -588,27 +594,27 @@ impl_method
588594
// they are ambiguous with traits. We do the same here, regrettably,
589595
// by splitting ty into ty and ty_prim.
590596
item_impl
591-
: maybe_unsafe IMPL generic_params ty_prim_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
597+
: maybe_unsafe maybe_default_impl generic_params ty_prim_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
592598
{
593-
$$ = mk_node("ItemImpl", 6, $1, $3, $4, $5, $7, $8);
599+
$$ = mk_node("ItemImpl", 6, $1, $3, $4, $5, $7, $8, $2);
594600
}
595-
| maybe_unsafe IMPL generic_params '(' ty ')' maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
601+
| maybe_unsafe maybe_default_impl generic_params '(' ty ')' maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
596602
{
597-
$$ = mk_node("ItemImpl", 6, $1, $3, 5, $6, $9, $10);
603+
$$ = mk_node("ItemImpl", 6, $1, $3, 5, $6, $9, $10, $2);
598604
}
599-
| maybe_unsafe IMPL generic_params trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
605+
| maybe_unsafe maybe_default_impl generic_params trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
600606
{
601-
$$ = mk_node("ItemImpl", 6, $3, $4, $6, $7, $9, $10);
607+
$$ = mk_node("ItemImpl", 6, $3, $4, $6, $7, $9, $10, $2);
602608
}
603-
| maybe_unsafe IMPL generic_params '!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
609+
| maybe_unsafe maybe_default_impl generic_params '!' trait_ref FOR ty_sum maybe_where_clause '{' maybe_inner_attrs maybe_impl_items '}'
604610
{
605-
$$ = mk_node("ItemImplNeg", 7, $1, $3, $5, $7, $8, $10, $11);
611+
$$ = mk_node("ItemImplNeg", 7, $1, $3, $5, $7, $8, $10, $11, $2);
606612
}
607-
| maybe_unsafe IMPL generic_params trait_ref FOR DOTDOT '{' '}'
613+
| maybe_unsafe maybe_default_impl generic_params trait_ref FOR DOTDOT '{' '}'
608614
{
609615
$$ = mk_node("ItemImplDefault", 3, $1, $3, $4);
610616
}
611-
| maybe_unsafe IMPL generic_params '!' trait_ref FOR DOTDOT '{' '}'
617+
| maybe_unsafe maybe_default_impl generic_params '!' trait_ref FOR DOTDOT '{' '}'
612618
{
613619
$$ = mk_node("ItemImplDefaultNeg", 3, $1, $3, $4);
614620
}
@@ -1935,4 +1941,4 @@ brackets_delimited_token_trees
19351941
$2,
19361942
mk_node("TTTok", 1, mk_atom("]")));
19371943
}
1938-
;
1944+
;

src/librustc/hir/lowering.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,9 @@ impl<'a> LoweringContext<'a> {
13621362
}
13631363
ItemKind::MacroDef(..) | ItemKind::Mac(..) => panic!("Shouldn't still be around"),
13641364
}
1365+
1366+
// [1] `defaultness.has_value()` is necer called for an `impl`, always `true` in order to
1367+
// not cause an assertion failure inside the `lower_defaultness` function
13651368
}
13661369

13671370
fn lower_trait_item(&mut self, i: &TraitItem) -> hir::TraitItem {

src/librustc/ich/impls_hir.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ impl_stable_hash_for!(enum hir::Item_ {
933933
ItemUnion(variant_data, generics),
934934
ItemTrait(unsafety, generics, bounds, item_refs),
935935
ItemDefaultImpl(unsafety, trait_ref),
936-
ItemImpl(unsafety, impl_polarity, generics, trait_ref, ty, impl_item_refs)
936+
ItemImpl(unsafety, impl_polarity, impl_defaultness, generics, trait_ref, ty, impl_item_refs)
937937
});
938938

939939
impl_stable_hash_for!(struct hir::TraitItemRef {

0 commit comments

Comments
 (0)