@@ -1499,46 +1499,64 @@ impl<'hir> LoweringContext<'_, 'hir> {
14991499 // previous iteration.
15001500 required_features. clear ( ) ;
15011501
1502- // Validate register classes against currently enabled target
1503- // features. We check that at least one type is available for
1504- // the current target.
15051502 let reg_class = reg. reg_class ( ) ;
15061503 if reg_class == asm:: InlineAsmRegClass :: Err {
15071504 continue ;
15081505 }
1509- for & ( _, feature) in reg_class. supported_types ( asm_arch. unwrap ( ) ) {
1510- if let Some ( feature) = feature {
1511- if self . sess . target_features . contains ( & Symbol :: intern ( feature) ) {
1506+
1507+ // We ignore target feature requirements for clobbers: if the
1508+ // feature is disabled then the compiler doesn't care what we
1509+ // do with the registers.
1510+ //
1511+ // Note that this is only possible for explicit register
1512+ // operands, which cannot be used in the asm string.
1513+ let is_clobber = matches ! (
1514+ op,
1515+ hir:: InlineAsmOperand :: Out {
1516+ reg: asm:: InlineAsmRegOrRegClass :: Reg ( _) ,
1517+ late: _,
1518+ expr: None
1519+ }
1520+ ) ;
1521+
1522+ if !is_clobber {
1523+ // Validate register classes against currently enabled target
1524+ // features. We check that at least one type is available for
1525+ // the current target.
1526+ for & ( _, feature) in reg_class. supported_types ( asm_arch. unwrap ( ) ) {
1527+ if let Some ( feature) = feature {
1528+ if self . sess . target_features . contains ( & Symbol :: intern ( feature) ) {
1529+ required_features. clear ( ) ;
1530+ break ;
1531+ } else {
1532+ required_features. push ( feature) ;
1533+ }
1534+ } else {
15121535 required_features. clear ( ) ;
15131536 break ;
1514- } else {
1515- required_features. push ( feature) ;
15161537 }
1517- } else {
1518- required_features. clear ( ) ;
1519- break ;
15201538 }
1521- }
1522- // We are sorting primitive strs here and can use unstable sort here
1523- required_features. sort_unstable ( ) ;
1524- required_features. dedup ( ) ;
1525- match & required_features [ .. ] {
1526- [ ] => { }
1527- [ feature ] => {
1528- let msg = format ! (
1529- "register class `{}` requires the `{}` target feature" ,
1530- reg_class . name ( ) ,
1531- feature
1532- ) ;
1533- sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1534- }
1535- features => {
1536- let msg = format ! (
1537- "register class `{}` requires at least one target feature: {}" ,
1538- reg_class . name ( ) ,
1539- features . join ( ", " )
1540- ) ;
1541- sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1539+ // We are sorting primitive strs here and can use unstable sort here
1540+ required_features . sort_unstable ( ) ;
1541+ required_features. dedup ( ) ;
1542+ match & required_features[ .. ] {
1543+ [ ] => { }
1544+ [ feature ] => {
1545+ let msg = format ! (
1546+ "register class `{}` requires the `{}` target feature" ,
1547+ reg_class . name ( ) ,
1548+ feature
1549+ ) ;
1550+ sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1551+ }
1552+ features => {
1553+ let msg = format ! (
1554+ "register class `{}` requires at least one target feature: {}" ,
1555+ reg_class . name ( ) ,
1556+ features . join ( ", " )
1557+ ) ;
1558+ sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1559+ }
15421560 }
15431561 }
15441562
0 commit comments