If I look at the production for strict_mark in the parser
https://github.com/ghc/ghc/blob/master/compiler/parser/Parser.y#L1355strict_mark :: { Located ([AddAnn],HsBang) }
: '!' { sL1 $1 ([],HsUserBang Nothing True) }
| '{-# UNPACK' '#-}' { sLL $1 $> ([mo $1,mc $2],HsUserBang (Just True) False) }
| '{-# NOUNPACK' '#-}' { sLL $1 $> ([mo $1,mc $2],HsUserBang (Just False) True) } -- ***Correct?
| '{-# UNPACK' '#-}' '!' { sLL $1 $> ([mo $1,mc $2],HsUserBang (Just True) True) }
| '{-# NOUNPACK' '#-}' '!' { sLL $1 $> ([mo $1,mc $2],HsUserBang (Just False) True) }
I would expect the final True or False value to reflect the presence of the '!' mark.