@@ -87,45 +87,64 @@ impl ExprCollector<'_> {
87
87
) ;
88
88
AsmOperand :: In { reg, expr }
89
89
} else if dir_spec. out_token ( ) . is_some ( ) {
90
- let expr = self . collect_expr_opt (
91
- op. asm_operand_expr ( ) . and_then ( |it| it. in_expr ( ) ) ,
92
- ) ;
93
- AsmOperand :: Out { reg, expr : Some ( expr) , late : false }
90
+ let expr = op
91
+ . asm_operand_expr ( )
92
+ . and_then ( |it| it. in_expr ( ) )
93
+ . filter ( |it| !matches ! ( it, ast:: Expr :: UnderscoreExpr ( _) ) )
94
+ . map ( |expr| self . collect_expr ( expr) ) ;
95
+ AsmOperand :: Out { reg, expr, late : false }
94
96
} else if dir_spec. lateout_token ( ) . is_some ( ) {
95
- let expr = self . collect_expr_opt (
96
- op. asm_operand_expr ( ) . and_then ( |it| it. in_expr ( ) ) ,
97
- ) ;
98
- AsmOperand :: Out { reg, expr : Some ( expr) , late : true }
97
+ let expr = op
98
+ . asm_operand_expr ( )
99
+ . and_then ( |it| it. in_expr ( ) )
100
+ . filter ( |it| !matches ! ( it, ast:: Expr :: UnderscoreExpr ( _) ) )
101
+ . map ( |expr| self . collect_expr ( expr) ) ;
102
+
103
+ AsmOperand :: Out { reg, expr, late : true }
99
104
} else if dir_spec. inout_token ( ) . is_some ( ) {
100
105
let Some ( op_expr) = op. asm_operand_expr ( ) else { continue } ;
101
106
let in_expr = self . collect_expr_opt ( op_expr. in_expr ( ) ) ;
102
- let out_expr =
103
- op_expr. out_expr ( ) . map ( |it| self . collect_expr ( it) ) ;
104
- match out_expr {
105
- Some ( out_expr) => AsmOperand :: SplitInOut {
106
- reg,
107
- in_expr,
108
- out_expr : Some ( out_expr) ,
109
- late : false ,
110
- } ,
111
- None => {
107
+ match op_expr. fat_arrow_token ( ) . is_some ( ) {
108
+ true => {
109
+ let out_expr = op_expr
110
+ . out_expr ( )
111
+ . filter ( |it| {
112
+ !matches ! ( it, ast:: Expr :: UnderscoreExpr ( _) )
113
+ } )
114
+ . map ( |expr| self . collect_expr ( expr) ) ;
115
+
116
+ AsmOperand :: SplitInOut {
117
+ reg,
118
+ in_expr,
119
+ out_expr,
120
+ late : false ,
121
+ }
122
+ }
123
+ false => {
112
124
AsmOperand :: InOut { reg, expr : in_expr, late : false }
113
125
}
114
126
}
115
127
} else if dir_spec. inlateout_token ( ) . is_some ( ) {
116
128
let Some ( op_expr) = op. asm_operand_expr ( ) else { continue } ;
117
129
let in_expr = self . collect_expr_opt ( op_expr. in_expr ( ) ) ;
118
- let out_expr =
119
- op_expr. out_expr ( ) . map ( |it| self . collect_expr ( it) ) ;
120
- match out_expr {
121
- Some ( out_expr) => AsmOperand :: SplitInOut {
122
- reg,
123
- in_expr,
124
- out_expr : Some ( out_expr) ,
125
- late : false ,
126
- } ,
127
- None => {
128
- AsmOperand :: InOut { reg, expr : in_expr, late : false }
130
+ match op_expr. fat_arrow_token ( ) . is_some ( ) {
131
+ true => {
132
+ let out_expr = op_expr
133
+ . out_expr ( )
134
+ . filter ( |it| {
135
+ !matches ! ( it, ast:: Expr :: UnderscoreExpr ( _) )
136
+ } )
137
+ . map ( |expr| self . collect_expr ( expr) ) ;
138
+
139
+ AsmOperand :: SplitInOut {
140
+ reg,
141
+ in_expr,
142
+ out_expr,
143
+ late : true ,
144
+ }
145
+ }
146
+ false => {
147
+ AsmOperand :: InOut { reg, expr : in_expr, late : true }
129
148
}
130
149
}
131
150
} else {
0 commit comments