@@ -15,6 +15,7 @@ use builder::Builder;
1515
1616use super :: FunctionCx ;
1717use super :: LocalRef ;
18+ use super :: OperandValue ;
1819
1920impl FunctionCx < ' a , ' ll , ' tcx > {
2021 pub fn codegen_statement ( & mut self ,
@@ -82,14 +83,27 @@ impl FunctionCx<'a, 'll, 'tcx> {
8283 self . codegen_place ( & bx, output)
8384 } ) . collect ( ) ;
8485
85- let input_vals = inputs. iter ( ) . map ( |input| {
86- self . codegen_operand ( & bx, input) . immediate ( )
87- } ) . collect ( ) ;
86+ let input_vals = inputs. iter ( )
87+ . try_fold ( Vec :: with_capacity ( inputs. len ( ) ) , |mut acc, input| {
88+ let op = self . codegen_operand ( & bx, input) ;
89+ if let OperandValue :: Immediate ( _) = op. val {
90+ acc. push ( op. immediate ( ) ) ;
91+ Ok ( acc)
92+ } else {
93+ Err ( op)
94+ }
95+ } ) ;
8896
89- let res = asm:: codegen_inline_asm ( & bx, asm, outputs, input_vals) ;
90- if !res {
91- span_err ! ( bx. sess( ) , statement. source_info. span, E0668 ,
92- "malformed inline assembly" ) ;
97+ if input_vals. is_err ( ) {
98+ span_err ! ( bx. sess( ) , statement. source_info. span, E0669 ,
99+ "invalid value for constraint in inline assembly" ) ;
100+ } else {
101+ let input_vals = input_vals. unwrap ( ) ;
102+ let res = asm:: codegen_inline_asm ( & bx, asm, outputs, input_vals) ;
103+ if !res {
104+ span_err ! ( bx. sess( ) , statement. source_info. span, E0668 ,
105+ "malformed inline assembly" ) ;
106+ }
93107 }
94108 bx
95109 }
0 commit comments