diff --git a/Cabal/Distribution/FieldGrammar/Class.hs b/Cabal/Distribution/FieldGrammar/Class.hs
index e6965125d337f782746a20aadad0c0ad5ebaffe0..ea78db49108be9c467a3070adfca7c3e67f70059 100644
--- a/Cabal/Distribution/FieldGrammar/Class.hs
+++ b/Cabal/Distribution/FieldGrammar/Class.hs
@@ -146,6 +146,19 @@ class
         -> g s a
         -> g s a
 
+    -- | Annotate field with since spec-version.
+    -- This is used to recognise, but warn about the field.
+    -- It is used to process @other-extensions@ field.
+    --
+    -- Default implementation is to not warn.
+    --
+    -- @since 3.4.0.0
+    availableSinceWarn
+        :: CabalSpecVersion  -- ^ spec version
+        -> g s a
+        -> g s a
+    availableSinceWarn _ = id
+
 -- | Field which can be defined at most once.
 uniqueField
     :: (FieldGrammar c g, c (Identity a))
diff --git a/Cabal/Distribution/FieldGrammar/Parsec.hs b/Cabal/Distribution/FieldGrammar/Parsec.hs
index d0a64eb7f5918191defef596cd8eb33de0b54302..085378f0c61c454af978d792e4ecc744685f8139 100644
--- a/Cabal/Distribution/FieldGrammar/Parsec.hs
+++ b/Cabal/Distribution/FieldGrammar/Parsec.hs
@@ -287,6 +287,20 @@ instance FieldGrammar Parsec ParsecFieldGrammar where
 
                 pure def
 
+    availableSinceWarn vs (ParsecFG names prefixes parser) = ParsecFG names prefixes parser'
+      where
+        parser' v values
+            | v >= vs = parser v values
+            | otherwise = do
+                let unknownFields = Map.intersection values $ Map.fromSet (const ()) names
+                for_ (Map.toList unknownFields) $ \(name, fields) ->
+                    for_ fields $ \(MkNamelessField pos _) ->
+                        parseWarning pos PWTUnknownField $
+                            "The field " <> show name <> " is available only since the Cabal specification version " ++ showCabalSpecVersion vs ++ "."
+
+                parser v values
+
+
     -- todo we know about this field
     deprecatedSince vs msg (ParsecFG names prefixes parser) = ParsecFG names prefixes parser'
       where
diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
index 65985bca4071925280bc24c28af4c94a007ffc1a..c2efd6d2b7043c2f3aab742b1e824a81c416dda6 100644
--- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs
+++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
@@ -538,7 +538,7 @@ buildInfoFieldGrammar = BuildInfo
     <*> monoidalFieldAla "default-extensions"   (alaList' FSep MQuoted)       L.defaultExtensions
         ^^^ availableSince CabalSpecV1_10 []
     <*> monoidalFieldAla "other-extensions"     formatOtherExtensions         L.otherExtensions
-        ^^^ availableSince CabalSpecV1_10 []
+        ^^^ availableSinceWarn CabalSpecV1_10
     <*> monoidalFieldAla "extensions"           (alaList' FSep MQuoted)       L.oldExtensions
         ^^^ deprecatedSince CabalSpecV1_12
             "Please use 'default-extensions' or 'other-extensions' fields."
diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs
index 9f63d15ecf9833ec0effa1fab9ab844489a56e01..7b5d87cc4336d72d2ecfb034b9eaea53b00f0689 100644
--- a/cabal-install/Distribution/Client/ProjectPlanning.hs
+++ b/cabal-install/Distribution/Client/ProjectPlanning.hs
@@ -2480,7 +2480,7 @@ availableSourceTargets elab =
               (Nothing,   True)  -> TargetBuildable (elabUnitId elab, cname)
                                                     TargetNotRequestedByDefault
               (Just True, False) ->
-                error "componentAvailableTargetStatus: impossible"
+                error $ "componentAvailableTargetStatus: impossible; cname=" ++ prettyShow cname
       where
         cname      = componentName component
         buildable  = PD.buildable (componentBuildInfo component)
diff --git a/cabal-install/Distribution/Solver/Modular/IndexConversion.hs b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs
index 37a34878f1595ff10096dfc70b113ef86b4c8c26..72d0b8193e3226fedc83046a5eae33cf795a4923 100644
--- a/cabal-install/Distribution/Solver/Modular/IndexConversion.hs
+++ b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs
@@ -90,8 +90,8 @@ convId ipi = (pn, I ver $ Inst $ IPI.installedUnitId ipi)
 convIP :: SI.InstalledPackageIndex -> IPI.InstalledPackageInfo -> (PN, I, PInfo)
 convIP idx ipi =
   case traverse (convIPId (DependencyReason pn M.empty S.empty) comp idx) (IPI.depends ipi) of
-        Nothing  -> (pn, i, PInfo [] M.empty M.empty (Just Broken))
-        Just fds -> ( pn, i, PInfo fds components M.empty Nothing)
+        Left u    -> (pn, i, PInfo [] M.empty M.empty (Just (Broken u)))
+        Right fds -> (pn, i, PInfo fds components M.empty Nothing)
  where
   -- TODO: Handle sub-libraries and visibility.
   components =
@@ -141,13 +141,13 @@ convIP idx ipi =
 -- May return Nothing if the package can't be found in the index. That
 -- indicates that the original package having this dependency is broken
 -- and should be ignored.
-convIPId :: DependencyReason PN -> Component -> SI.InstalledPackageIndex -> UnitId -> Maybe (FlaggedDep PN)
+convIPId :: DependencyReason PN -> Component -> SI.InstalledPackageIndex -> UnitId -> Either UnitId (FlaggedDep PN)
 convIPId dr comp idx ipid =
   case SI.lookupUnitId idx ipid of
-    Nothing  -> Nothing
+    Nothing  -> Left ipid
     Just ipi -> let (pn, i) = convId ipi
                     name = ExposedLib LMainLibName  -- TODO: Handle sub-libraries.
-                in  Just (D.Simple (LDep dr (Dep (PkgComponent pn name) (Fixed i))) comp)
+                in  Right (D.Simple (LDep dr (Dep (PkgComponent pn name) (Fixed i))) comp)
                 -- NB: something we pick up from the
                 -- InstalledPackageIndex is NEVER an executable
 
diff --git a/cabal-install/Distribution/Solver/Modular/Message.hs b/cabal-install/Distribution/Solver/Modular/Message.hs
index 9624f76e02eb7475c4dff38e3169d7305daac7b8..126c1628e9a29e1c165fd17d3ee8c9af0d924c55 100644
--- a/cabal-install/Distribution/Solver/Modular/Message.hs
+++ b/cabal-install/Distribution/Solver/Modular/Message.hs
@@ -230,7 +230,7 @@ showFR _ CannotInstall                    = " (only already installed instances
 showFR _ CannotReinstall                  = " (avoiding to reinstall a package with same version but new dependencies)"
 showFR _ NotExplicit                      = " (not a user-provided goal nor mentioned as a constraint, but reject-unconstrained-dependencies was set)"
 showFR _ Shadowed                         = " (shadowed by another installed package with same version)"
-showFR _ Broken                           = " (package is broken)"
+showFR _ (Broken u)                       = " (package is broken, missing depenedency " ++ prettyShow u ++ ")"
 showFR _ UnknownPackage                   = " (unknown package)"
 showFR _ (GlobalConstraintVersion vr src) = " (" ++ constraintSource src ++ " requires " ++ prettyShow vr ++ ")"
 showFR _ (GlobalConstraintInstalled src)  = " (" ++ constraintSource src ++ " requires installed instance)"
diff --git a/cabal-install/Distribution/Solver/Modular/Tree.hs b/cabal-install/Distribution/Solver/Modular/Tree.hs
index ca7099278c77aa95faba93d6201378577c387b7b..b28c0f8ff985c98e99c231211ed8a0516661f8f5 100644
--- a/cabal-install/Distribution/Solver/Modular/Tree.hs
+++ b/cabal-install/Distribution/Solver/Modular/Tree.hs
@@ -32,6 +32,7 @@ import Distribution.Solver.Types.ConstraintSource
 import Distribution.Solver.Types.Flag
 import Distribution.Solver.Types.PackagePath
 import Distribution.Types.PkgconfigVersionRange
+import Distribution.Types.UnitId (UnitId)
 import Language.Haskell.Extension (Extension, Language)
 
 type Weight = Double
@@ -111,7 +112,7 @@ data FailReason = UnsupportedExtension Extension
                 | CannotReinstall
                 | NotExplicit
                 | Shadowed
-                | Broken
+                | Broken UnitId
                 | UnknownPackage
                 | GlobalConstraintVersion VR ConstraintSource
                 | GlobalConstraintInstalled ConstraintSource
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs
new file mode 100644
index 0000000000000000000000000000000000000000..ef2ad8bb3fc59231804deee3df6b6a6f5c01b528
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs
@@ -0,0 +1 @@
+module M where
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..6dfd0a150db26898bf4389a0936502b926d50b29
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out
@@ -0,0 +1,7 @@
+# cabal v2-build
+Resolving dependencies...
+cabal: Could not resolve dependencies:
+[__0] next goal: issue7234 (user goal)
+[__0] rejecting: issue7234-0 (conflict: requires HopefullyThisExtensionWontOccur)
+[__0] fail (backjumping, conflict set: issue7234)
+After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: issue7234 (2)
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project
new file mode 100644
index 0000000000000000000000000000000000000000..e6fdbadb4398bc0e333947b5fb8021778310d943
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project
@@ -0,0 +1 @@
+packages: .
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..6a83874e8661fb8bfe9d727046f73befa6af2fef
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs
@@ -0,0 +1,5 @@
+import Test.Cabal.Prelude
+main = cabalTest $
+  -- this should fail,
+  -- none of GHC have extension declared in other-extensions
+  fails $ cabal "v2-build" ["all"]
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..7f94105dd011155ee6820737114576000bf0861b
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal
@@ -0,0 +1,14 @@
+cabal-version: >=1.8
+name:          issue7234
+version:       0
+synopsis:      Old cabal-version package
+description:   But we have other-extensions to guide solver
+author:        Oleg Grenrus
+category:      Tests
+maintainer:    oleg.grenrus@iki.fi
+build-type:    Simple
+
+library
+  build-depends:    base <5
+  other-extensions: HopefullyThisExtensionWontOccur
+  exposed-modules:  M
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs
new file mode 100644
index 0000000000000000000000000000000000000000..ef2ad8bb3fc59231804deee3df6b6a6f5c01b528
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs
@@ -0,0 +1 @@
+module M where
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..347976aa80750b8701aad841829b223ebe27eb4c
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out
@@ -0,0 +1,9 @@
+# cabal v2-build
+Resolving dependencies...
+Build profile: -w ghc-<GHCVER> -O1
+In order, the following will be built:
+ - issue7234-0 (lib) (first run)
+Warning: issue7234.cabal:14:3: The field "other-extensions" is available only since the Cabal specification version 1.10.
+Configuring library for issue7234-0..
+Preprocessing library for issue7234-0..
+Building library for issue7234-0..
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project
new file mode 100644
index 0000000000000000000000000000000000000000..e6fdbadb4398bc0e333947b5fb8021778310d943
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project
@@ -0,0 +1 @@
+packages: .
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..caaeb22728d699b14b6875bb0b0b8a72fe4326e5
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs
@@ -0,0 +1,4 @@
+import Test.Cabal.Prelude
+main = cabalTest $
+  -- this should not fail, just warn.
+   cabal "v2-build" ["all"]
diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..dad34460df84769de7ced05b95679be464c55e4e
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal
@@ -0,0 +1,15 @@
+cabal-version: >=1.8
+name:          issue7234
+version:       0
+synopsis:      Old cabal-version package
+description:   But we have other-extensions to guide solver
+author:        Oleg Grenrus
+category:      Tests
+maintainer:    oleg.grenrus@iki.fi
+build-type:    Simple
+
+library
+  build-depends:    base <5
+  -- this extension is in virtually all GHCs, but there should be a warning
+  other-extensions: GADTs
+  exposed-modules:  M