@@ -77,27 +77,66 @@ class CompileVarDecl : public HIRCompileBase, public HIR::HIRPatternVisitor
77
77
78
78
void visit (HIR::TuplePattern &pattern) override
79
79
{
80
+ rust_assert (TREE_CODE (translated_type) == RECORD_TYPE);
80
81
switch (pattern.get_items ().get_item_type ())
81
82
{
82
83
case HIR::TuplePatternItems::ItemType::NO_REST:
83
84
{
84
- rust_assert (TREE_CODE (translated_type) == RECORD_TYPE);
85
- auto &items = static_cast <HIR::TuplePatternItemsNoRest &> (
85
+ auto &items_no_rest = static_cast <HIR::TuplePatternItemsNoRest &> (
86
86
pattern.get_items ());
87
87
88
- size_t offs = 0 ;
89
- for (auto &sub : items .get_patterns ())
88
+ tree field = TYPE_FIELDS (translated_type) ;
89
+ for (auto &sub : items_no_rest .get_patterns ())
90
90
{
91
- tree sub_ty = error_mark_node;
92
- tree field = TYPE_FIELDS (translated_type);
93
- for (size_t i = 0 ; i < offs; i++)
91
+ gcc_assert (field != NULL_TREE);
92
+ tree sub_ty = TREE_TYPE (field);
93
+ CompileVarDecl::compile (fndecl, sub_ty, sub.get (), ctx);
94
+ field = DECL_CHAIN (field);
95
+ }
96
+ }
97
+ break ;
98
+
99
+ case HIR::TuplePatternItems::ItemType::HAS_REST:
100
+ {
101
+ auto &items_has_rest = static_cast <HIR::TuplePatternItemsHasRest &> (
102
+ pattern.get_items ());
103
+
104
+ // count total fields in translated_type
105
+ size_t total_fields = 0 ;
106
+ for (tree t = TYPE_FIELDS (translated_type); t; t = DECL_CHAIN (t))
107
+ {
108
+ total_fields++;
109
+ }
110
+
111
+ // process lower patterns
112
+ tree field = TYPE_FIELDS (translated_type);
113
+ for (auto &sub : items_has_rest.get_lower_patterns ())
114
+ {
115
+ gcc_assert (field != NULL_TREE);
116
+ tree sub_ty = TREE_TYPE (field);
117
+ CompileVarDecl::compile (fndecl, sub_ty, sub.get (), ctx);
118
+ field = DECL_CHAIN (field);
119
+ }
120
+
121
+ // process upper patterns
122
+ if (!items_has_rest.get_upper_patterns ().empty ())
123
+ {
124
+ size_t upper_start
125
+ = total_fields - items_has_rest.get_upper_patterns ().size ();
126
+ field = TYPE_FIELDS (translated_type);
127
+ for (size_t i = 0 ; i < upper_start; i++)
94
128
{
95
129
field = DECL_CHAIN (field);
96
130
gcc_assert (field != NULL_TREE);
97
131
}
98
- sub_ty = TREE_TYPE (field);
99
- CompileVarDecl::compile (fndecl, sub_ty, sub.get (), ctx);
100
- offs++;
132
+
133
+ for (auto &sub : items_has_rest.get_upper_patterns ())
134
+ {
135
+ gcc_assert (field != NULL_TREE);
136
+ tree sub_ty = TREE_TYPE (field);
137
+ CompileVarDecl::compile (fndecl, sub_ty, sub.get (), ctx);
138
+ field = DECL_CHAIN (field);
139
+ }
101
140
}
102
141
}
103
142
break ;
0 commit comments