diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,17 @@
 # Changelog
 
+## [0.11.0.0] - 2025-09-29
+
+This is technically a breaking change, but if you don't use any `opt-env-conf`
+internals, nothing should break for you.
+
+### Changed
+
+* `ParserMany` and `ParserSome` can now carry source locations.
+  This is not likely to happen often because the `Alternative` class does not
+  have a `HasCallStack` super class, but could still happen when using
+  `someNonEmpty`.
+
 ## [0.10.0.0] - 2025-09-17
 
 This is technically a breaking change, but if you don't use any `opt-env-conf`
diff --git a/opt-env-conf.cabal b/opt-env-conf.cabal
--- a/opt-env-conf.cabal
+++ b/opt-env-conf.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           opt-env-conf
-version:        0.10.0.0
+version:        0.11.0.0
 synopsis:       Settings parsing for Haskell: command-line arguments, environment variables, and configuration values.
 homepage:       https://github.com/NorfairKing/opt-env-conf#readme
 bug-reports:    https://github.com/NorfairKing/opt-env-conf/issues
diff --git a/src/OptEnvConf/Completion.hs b/src/OptEnvConf/Completion.hs
--- a/src/OptEnvConf/Completion.hs
+++ b/src/OptEnvConf/Completion.hs
@@ -273,12 +273,12 @@
       ParserAlt p1 p2 -> orCompletions p1 p2
       ParserSelect p1 p2 -> andCompletions p1 p2
       ParserEmpty _ -> pure Nothing
-      ParserMany p -> do
+      ParserMany _ p -> do
         mR <- go p
         case mR of
           Nothing -> pure Nothing
           Just os -> fmap (os ++) <$> go p
-      ParserSome p -> do
+      ParserSome _ p -> do
         mR <- go p
         case mR of
           Nothing -> pure Nothing
diff --git a/src/OptEnvConf/Doc.hs b/src/OptEnvConf/Doc.hs
--- a/src/OptEnvConf/Doc.hs
+++ b/src/OptEnvConf/Doc.hs
@@ -169,8 +169,8 @@
       ParserSelect p1 p2 -> AnyDocsAnd [go p1, go p2]
       ParserEmpty _ -> AnyDocsOr []
       ParserAlt p1 p2 -> AnyDocsOr [go p1, go p2]
-      ParserMany p -> AnyDocsOr [go p, AnyDocsSingle Nothing]
-      ParserSome p -> AnyDocsAnd [go p, go (ParserMany p)] -- TODO: is this right?
+      ParserMany _ p -> AnyDocsOr [go p, AnyDocsSingle Nothing]
+      ParserSome mLoc p -> AnyDocsAnd [go p, go (ParserMany mLoc p)] -- TODO: is this right?
       ParserAllOrNothing _ p -> go p
       ParserCheck _ _ _ p -> go p
       ParserCommands _ mDefault cs -> AnyDocsCommands mDefault $ map commandParserDocs cs
diff --git a/src/OptEnvConf/Lint.hs b/src/OptEnvConf/Lint.hs
--- a/src/OptEnvConf/Lint.hs
+++ b/src/OptEnvConf/Lint.hs
@@ -258,16 +258,16 @@
         c2 <- go p2
         pure (c1 && c2) -- TODO: is this right?
         -- TODO lint if we don't try to parse anything consuming under many.
-      ParserMany p -> do
+      ParserMany mLoc p -> do
         c <- go p
         when (not c) $
-          mapValidationTFailure (LintError Nothing) $
+          mapValidationTFailure (LintError mLoc) $
             validationTFailure LintErrorManyInfinite
         pure c
-      ParserSome p -> do
+      ParserSome mLoc p -> do
         c <- go p
         when (not c) $
-          mapValidationTFailure (LintError Nothing) $
+          mapValidationTFailure (LintError mLoc) $
             validationTFailure LintErrorManyInfinite
         pure c
       ParserAllOrNothing _ p -> go p
diff --git a/src/OptEnvConf/Nix.hs b/src/OptEnvConf/Nix.hs
--- a/src/OptEnvConf/Nix.hs
+++ b/src/OptEnvConf/Nix.hs
@@ -36,8 +36,8 @@
       ParserSelect p1 p2 -> M.unionWith combineOption (go p1) (go p2)
       ParserEmpty _ -> M.empty
       ParserAlt p1 p2 -> M.unionWith combineOption (go p1) (go p2) -- TODO is this right?
-      ParserMany p -> go p
-      ParserSome p -> go p
+      ParserMany _ p -> go p
+      ParserSome _ p -> go p
       ParserAllOrNothing _ p -> go p
       ParserCheck _ _ _ p -> go p
       ParserCommands _ _ cs -> M.unionsWith combineOption $ map goCommand cs
diff --git a/src/OptEnvConf/Parser.hs b/src/OptEnvConf/Parser.hs
--- a/src/OptEnvConf/Parser.hs
+++ b/src/OptEnvConf/Parser.hs
@@ -175,9 +175,11 @@
     !(Parser a) ->
     Parser a
   ParserMany ::
+    !(Maybe SrcLoc) ->
     !(Parser a) ->
     Parser [a]
   ParserSome ::
+    !(Maybe SrcLoc) ->
     !(Parser a) ->
     Parser (NonEmpty a)
   ParserAllOrNothing ::
@@ -245,8 +247,8 @@
           ParserSelect pe pf -> isEmpty pe && isEmpty pf
           ParserEmpty _ -> True
           ParserAlt _ _ -> False
-          ParserMany p -> isEmpty p
-          ParserSome p -> isEmpty p
+          ParserMany _ p -> isEmpty p
+          ParserSome _ p -> isEmpty p
           ParserAllOrNothing _ p -> isEmpty p
           ParserCheck _ _ _ p -> isEmpty p
           ParserCommands _ _ cs -> null cs
@@ -278,8 +280,8 @@
                     ParserCommands (mLoc1 <|> mLoc2) (mDefault1 <|> mDefault2) (cs1 ++ cs2)
                   _ -> ParserAlt p1' p2'
              in go p1 p2
-  many = ParserMany
-  some = fmap NE.toList . ParserSome
+  many = ParserMany Nothing
+  some = fmap NE.toList . ParserSome Nothing
 
 showParserABit :: Parser a -> String
 showParserABit = ($ "") . showParserPrec 0
@@ -311,13 +313,17 @@
             . go 11 p1
             . showString " "
             . go 11 p2
-      ParserMany p ->
+      ParserMany mLoc p ->
         showParen (d > 10) $
           showString "Many "
+            . showsPrec 11 mLoc
+            . showString " "
             . go 11 p
-      ParserSome p ->
+      ParserSome mLoc p ->
         showParen (d > 10) $
           showString "Some "
+            . showsPrec 11 mLoc
+            . showString " "
             . go 11 p
       ParserAllOrNothing mLoc p ->
         showParen (d > 10) $
@@ -507,8 +513,10 @@
       argument : reader str : metavar "STR" : builders
 
 -- | Like 'some' but with a more accurate type
-someNonEmpty :: Parser a -> Parser (NonEmpty a)
-someNonEmpty = ParserSome
+someNonEmpty :: (HasCallStack) => Parser a -> Parser (NonEmpty a)
+someNonEmpty = ParserSome mLoc
+  where
+    mLoc = snd <$> listToMaybe (getCallStack callStack)
 
 -- | Give a parser a default value.
 --
@@ -1106,8 +1114,8 @@
       ParserSelect p1 p2 -> ParserSelect (go p1) (go p2)
       ParserEmpty _ -> ParserEmpty Nothing
       ParserAlt p1 p2 -> ParserAlt (go p1) (go p2)
-      ParserMany p -> ParserMany (go p)
-      ParserSome p -> ParserSome (go p)
+      ParserMany _ p -> ParserMany Nothing (go p)
+      ParserSome _ p -> ParserSome Nothing (go p)
       ParserAllOrNothing _ p -> ParserAllOrNothing Nothing (go p)
       ParserCheck _ forgivable f p -> ParserCheck Nothing forgivable f (go p)
       ParserCommands _ mDefault cs -> ParserCommands Nothing mDefault $ map commandEraseSrcLocs cs
@@ -1143,8 +1151,8 @@
       ParserSelect p1 p2 -> ParserSelect <$> go p1 <*> go p2
       ParserEmpty mLoc -> pure $ ParserEmpty mLoc
       ParserAlt p1 p2 -> ParserAlt <$> go p1 <*> go p2
-      ParserMany p -> ParserMany <$> go p
-      ParserSome p -> ParserSome <$> go p
+      ParserMany mLoc p -> ParserMany mLoc <$> go p
+      ParserSome mLoc p -> ParserSome mLoc <$> go p
       ParserAllOrNothing mLoc p -> ParserAllOrNothing mLoc <$> go p
       ParserCheck mLoc forgivable f p -> ParserCheck mLoc forgivable f <$> go p
       ParserCommands mLoc mDefault cs -> ParserCommands mLoc mDefault <$> traverse (commandTraverseSetting func) cs
@@ -1172,8 +1180,8 @@
       ParserSelect p1 p2 -> M.union (go p1) (go p2)
       ParserEmpty _ -> M.empty
       ParserAlt p1 p2 -> M.union (go p1) (go p2)
-      ParserMany p -> go p
-      ParserSome p -> go p
+      ParserMany _ p -> go p
+      ParserSome _ p -> go p
       ParserAllOrNothing _ p -> go p -- TODO is this right?
       ParserCheck _ _ _ p -> go p
       ParserCommands _ _ cs -> M.unions $ map (go . commandParser) cs
diff --git a/src/OptEnvConf/Run.hs b/src/OptEnvConf/Run.hs
--- a/src/OptEnvConf/Run.hs
+++ b/src/OptEnvConf/Run.hs
@@ -381,21 +381,21 @@
             Nothing -> do
               debug ["Left side failed, trying right side."]
               ppIndent $ go p2
-      ParserMany p' -> do
-        debug [syntaxChunk "Many"]
+      ParserMany mLoc p' -> do
+        debug [syntaxChunk "Many", ": ", mSrcLocChunk mLoc]
         ppIndent $ do
           eor <- tryPP $ go p'
           case eor of
             Nothing -> pure []
             Just a -> do
-              as <- go (ParserMany p')
+              as <- go (ParserMany mLoc p')
               pure (a : as)
-      ParserSome p' -> do
-        debug [syntaxChunk "Some"]
+      ParserSome mLoc p' -> do
+        debug [syntaxChunk "Some", ": ", mSrcLocChunk mLoc]
         ppIndent $ do
           a <- go p'
           debug ["First element of some succeeded, continuing with Many"]
-          as <- go (ParserMany p')
+          as <- go (ParserMany mLoc p')
           pure (a :| as)
       ParserAllOrNothing mLoc p' -> do
         debug [syntaxChunk "AllOrNothing", ": ", mSrcLocChunk mLoc]
@@ -769,11 +769,11 @@
                   Nothing -> do
                     debug ["Left side failed, trying right side."]
                     ppIndent $ go p2
-            ParserMany p' -> do
-              debug [syntaxChunk "Many"]
+            ParserMany mLoc p' -> do
+              debug [syntaxChunk "Many", ": ", mSrcLocChunk mLoc]
               ppIndent $ go p'
-            ParserSome p' -> do
-              debug [syntaxChunk "Some"]
+            ParserSome mLoc p' -> do
+              debug [syntaxChunk "Some", ": ", mSrcLocChunk mLoc]
               ppIndent $ go p'
             ParserAllOrNothing mLoc p' -> do
               debug [syntaxChunk "AllOrNothing", ": ", mSrcLocChunk mLoc]
