diff --git a/CHANGELOG.md b/CHANGELOG.md index 384c7de326841d933703d49dd8b28e00883f0660..9aabd3cf68a40b03b668648d194b54d99e7b09c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - SC1117 about unknown double-quoted escape sequences has been retired ### Fixed - SC2021 no longer triggers for equivalence classes like '[=e=]' +- SC2221/SC2222 no longer mistriggers on fall-through case branches ## v0.5.0 - 2018-05-31 ### Added diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index 07d5766d28dc52a56960d11d6907410547dcb179..5b8aa367f4db3cee2101dd3948788720bf314b9c 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -2686,26 +2686,31 @@ prop_checkUnmatchableCases5 = verify checkUnmatchableCases "case $f in *.txt) tr prop_checkUnmatchableCases6 = verifyNot checkUnmatchableCases "case $f in ?*) true;; *) false;; esac" prop_checkUnmatchableCases7 = verifyNot checkUnmatchableCases "case $f in $(x)) true;; asdf) false;; esac" prop_checkUnmatchableCases8 = verify checkUnmatchableCases "case $f in cow) true;; bar|cow) false;; esac" +prop_checkUnmatchableCases9 = verifyNot checkUnmatchableCases "case $f in x) true;;& x) false;; esac" checkUnmatchableCases _ t = case t of T_CaseExpression _ word list -> do - let patterns = concatMap snd3 list + -- Check all patterns for whether they can ever match + let allpatterns = concatMap snd3 list + -- Check only the non-fallthrough branches for shadowing + let breakpatterns = concatMap snd3 $ filter (\x -> fst3 x == CaseBreak) list if isConstant word then warn (getId word) 2194 "This word is constant. Did you forget the $ on a variable?" else potentially $ do pg <- wordToPseudoGlob word - return $ mapM_ (check pg) patterns + return $ mapM_ (check pg) allpatterns - let exactGlobs = tupMap wordToExactPseudoGlob patterns - let fuzzyGlobs = tupMap wordToPseudoGlob patterns + let exactGlobs = tupMap wordToExactPseudoGlob breakpatterns + let fuzzyGlobs = tupMap wordToPseudoGlob breakpatterns let dominators = zip exactGlobs (tails $ drop 1 fuzzyGlobs) mapM_ checkDoms dominators _ -> return () where + fst3 (x,_,_) = x snd3 (_,x,_) = x check target candidate = potentially $ do candidateGlob <- wordToPseudoGlob candidate