diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -2,6 +2,12 @@
 
 ## Unreleased changes
 
+## 8.8.5.2 released 2020-02-16
+- New `DynFlags` functions `readExtension, `extensionImplications`.
+
+## 8.8.5.1 released 2020-02-09
+- Expression predicate tests.
+
 ## 8.8.5.0 released 2020-02-07
 - Expose `impliedGFlags` and friends from `DynFlags` (https://github.com/shayne-fletcher/ghc-lib-parser-ex/issues/19).
 
diff --git a/ghc-lib-parser-ex.cabal b/ghc-lib-parser-ex.cabal
--- a/ghc-lib-parser-ex.cabal
+++ b/ghc-lib-parser-ex.cabal
@@ -1,6 +1,6 @@
 cabal-version: >= 1.18
 name:           ghc-lib-parser-ex
-version:        8.8.5.1
+version:        8.8.5.2
 description:    Please see the README on GitHub at <https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme>
 homepage:       https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme
 bug-reports:    https://github.com/shayne-fletcher/ghc-lib-parser-ex/issues
@@ -44,7 +44,8 @@
   build-depends:
       base >=4.7 && <5,
       uniplate >= 1.5,
-      bytestring >= 0.10.8.2
+      bytestring >= 0.10.8.2,
+      containers >= 0.6.0.1
   if !flag(ghc-lib) && impl(ghc >= 8.8.0) && impl(ghc < 8.9.0)
       build-depends:
         ghc == 8.8.*,
diff --git a/src/Language/Haskell/GhclibParserEx/DynFlags.hs b/src/Language/Haskell/GhclibParserEx/DynFlags.hs
--- a/src/Language/Haskell/GhclibParserEx/DynFlags.hs
+++ b/src/Language/Haskell/GhclibParserEx/DynFlags.hs
@@ -5,9 +5,11 @@
 #include "ghclib_api.h"
 
 module Language.Haskell.GhclibParserEx.DynFlags(
+      readExtension
+    , extensionImplications
     -- Copied from DynFlags (see
     -- https://gitlab.haskell.org/ghc/ghc/merge_requests/2654).
-      TurnOnFlag, turnOn, turnOff, impliedGFlags, impliedOffGFlags, impliedXFlags
+    , TurnOnFlag, turnOn, turnOff, impliedGFlags, impliedOffGFlags, impliedXFlags
     --
     , parsePragmasIntoDynFlags
   ) where
@@ -20,6 +22,23 @@
 import HscTypes
 import GHC.LanguageExtensions.Type
 import Data.List
+import Data.Maybe
+import qualified Data.Map as Map
+
+-- | Parse a GHC extension.
+readExtension :: String -> Maybe Extension
+readExtension = (`Map.lookup` exts)
+  where exts = Map.fromList [(show x, x) | x <- [minBound .. maxBound]]
+
+-- | Implicitly enabled/disabled extensions.
+extensionImplications :: [(Extension, ([Extension], [Extension]))]
+extensionImplications = map f $ Map.toList implicationsMap
+  where
+    f (e, ps) = (fromJust (readExtension e), ps)
+    implicationsMap :: Map.Map String ([Extension], [Extension])
+    implicationsMap = Map.fromListWith (<>)
+      [(show a, ([c | b], [c | not b]))
+        | (a, flag, c) <- impliedXFlags, let b = flag == turnOn]
 
 -- Copied from 'ghc/compiler/main/DynFlags.hs'.
 
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -50,6 +50,7 @@
   , fixityTests
   , extendInstancesTests
   , expressionPredicateTests
+  , dynFlagsTests
   ]
 
 makeFile :: FilePath -> String -> IO FilePath
@@ -253,3 +254,11 @@
     test s = exprTest s flags
     flags = foldl' xopt_set (defaultDynFlags fakeSettings fakeLlvmConfig)
               [ TemplateHaskell, QuasiQuotes, TypeApplications, LambdaCase ]
+
+dynFlagsTests :: TestTree
+dynFlagsTests = testGroup "DynFlags tests"
+  [ testCase "extensionImplications" $ do
+      Just (_, (es, ds)) <- return $ find (\(e, _) -> e == DeriveTraversable) extensionImplications
+      assertBool "no extensions disabled" (null ds)
+      assertBool "two extensions enabled" $ DeriveFunctor `elem` es && DeriveFoldable `elem` es
+  ]
