Skip to content

Commit 198d3ee

Browse files
liamnaddellCohenArthur
authored andcommitted
Fix NR2.0 compiler ICE caused by Generics in Enums
gcc/rust/ChangeLog: * resolve/rust-late-name-resolver-2.0.cc: Change the late name resolver to enter proper lexical scope during typechecking * resolve/rust-late-name-resolver-2.0.h: Add needed prototype to header * resolve/rust-toplevel-name-resolver-2.0.cc: Add generic parameters to enum's scoped RIB to allow for proper name resolution on types. gcc/testsuite/ChangeLog: * rust/compile/issue-3304.rs: Add small test for generics+enums combination for NR2.0 Signed-off-by: Liam Naddell <liam.naddell@mail.utoronto.ca>
1 parent 6205877 commit 198d3ee

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed

gcc/rust/resolve/rust-late-name-resolver-2.0.cc

+7
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,13 @@ Late::visit (AST::StructStruct &s)
295295
ctx.scoped (Rib::Kind::Item, s.get_node_id (), s_vis);
296296
}
297297

298+
void
299+
Late::visit (AST::Enum &s)
300+
{
301+
auto s_vis = [this, &s] () { AST::DefaultASTVisitor::visit (s); };
302+
ctx.scoped (Rib::Kind::Item, s.get_node_id (), s_vis);
303+
}
304+
298305
void
299306
Late::visit (AST::StructExprStruct &s)
300307
{

gcc/rust/resolve/rust-late-name-resolver-2.0.h

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class Late : public DefaultResolver
5252
void visit (AST::StructExprStructBase &) override;
5353
void visit (AST::StructExprStructFields &) override;
5454
void visit (AST::StructStruct &) override;
55+
void visit (AST::Enum &) override;
5556
void visit (AST::GenericArgs &) override;
5657
void visit (AST::GenericArg &);
5758

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

+9
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,15 @@ TopLevel::visit (AST::EnumItemDiscriminant &variant)
332332
void
333333
TopLevel::visit (AST::Enum &enum_item)
334334
{
335+
auto generic_vis = [this, &enum_item] () {
336+
for (auto &g : enum_item.get_generic_params ())
337+
{
338+
g->accept_vis (*this);
339+
}
340+
};
341+
342+
ctx.scoped (Rib::Kind::Item, enum_item.get_node_id (), generic_vis);
343+
335344
insert_or_error_out (enum_item.get_identifier (), enum_item,
336345
Namespace::Types);
337346

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// { dg-additional-options "-frust-name-resolution-2.0" }
2+
#[lang = "sized"]
3+
trait Sized {}
4+
5+
pub enum ROption<T> {
6+
RSome(T),
7+
RNone,
8+
}
9+
10+
fn main() {}

0 commit comments

Comments
 (0)