diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index 77898ce..0c31e17 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -2139,6 +2139,7 @@ prop_checkUnassignedReferences23= verifyTree checkUnassignedReferences "declare prop_checkUnassignedReferences24= verifyNotTree checkUnassignedReferences "declare -A foo; foo[bar]=42;" prop_checkUnassignedReferences25= verifyNotTree checkUnassignedReferences "declare -A foo=(); foo[bar]=42;" prop_checkUnassignedReferences26= verifyNotTree checkUnassignedReferences "a::b() { foo; }; readonly -f a::b" +prop_checkUnassignedReferences27= verifyNotTree checkUnassignedReferences ": ${foo:=bar}" checkUnassignedReferences params t = warnings where (readMap, writeMap) = execState (mapM tally $ variableFlow params) (Map.empty, Map.empty) diff --git a/ShellCheck/AnalyzerLib.hs b/ShellCheck/AnalyzerLib.hs index 78aee8c..9c3a527 100644 --- a/ShellCheck/AnalyzerLib.hs +++ b/ShellCheck/AnalyzerLib.hs @@ -334,6 +334,12 @@ getModifiedVariables t = name <- getLiteralString lhs return (t, t, name, DataString $ SourceFrom [rhs]) + T_DollarBraced _ l -> maybeToList $ do + let string = bracedString t + let modifier = getBracedModifier string + guard $ ":=" `isPrefixOf` modifier + return (t, t, getBracedReference string, DataString $ SourceFrom [l]) + t@(T_FdRedirect _ ('{':var) op) -> -- {foo}>&2 modifies foo [(t, t, takeWhile (/= '}') var, DataString SourceInteger) | not $ isClosingFileOp op]