Skip to content
  • Alex D's avatar
    Implement -Wredundant-bang-patterns (#17340) · c9b73a05
    Alex D authored
    Add new flag '-Wredundant-bang-patterns' that enables checks for "dead" bangs.
    Dead bangs are the ones that under no circumstances can force a thunk that
    wasn't already forced. Dead bangs are a form of redundant bangs. The new check
    is performed in Pattern-Match Coverage Checker along with other checks (namely,
    redundant and inaccessible RHSs). Given
    
        f :: Bool -> Int
        f True = 1
        f !x   = 2
    
    we can detect dead bang patterns by checking whether @x ~ ⊥@ is satisfiable
    where the PmBang appears in 'checkGrdTree'. If not, then clearly the bang is
    dead. Such a dead bang is then indicated in the annotated pattern-match tree by
    a 'RedundantSrcBang' wrapping. In 'redundantAndInaccessibles', we collect
    all dead bangs to warn about.
    
    Note that we don't want to warn for a dead bang that appears on a redundant
    clause. That is because in that case, we recommend to delete the clause wholly,
    including its leading pattern match.
    
    Dead bang patterns are redundant. But there are bang patterns which are
    redundant that aren't dead, for example
    
        f !() = 0
    
    the bang still forces the match variable, before we attempt to match on (). But
    it is redundant with the forcing done by the () match. We currently don't
    detect redundant bangs that aren't dead.
    c9b73a05