gh-113317, AC: Move warn() and fail() to libclinic.errors (#116770)

diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 893f4cc..4c7c4dc 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -44,14 +44,13 @@
     Protocol,
     TypeVar,
     cast,
-    overload,
 )
 
 
 # Local imports.
 import libclinic
 import libclinic.cpp
-from libclinic import ClinicError
+from libclinic import ClinicError, fail, warn
 
 
 # TODO:
@@ -94,51 +93,6 @@ def __repr__(self) -> str:
 TemplateDict = dict[str, str]
 
 
-@overload
-def warn_or_fail(
-    *args: object,
-    fail: Literal[True],
-    filename: str | None = None,
-    line_number: int | None = None,
-) -> NoReturn: ...
-
-@overload
-def warn_or_fail(
-    *args: object,
-    fail: Literal[False] = False,
-    filename: str | None = None,
-    line_number: int | None = None,
-) -> None: ...
-
-def warn_or_fail(
-    *args: object,
-    fail: bool = False,
-    filename: str | None = None,
-    line_number: int | None = None,
-) -> None:
-    joined = " ".join([str(a) for a in args])
-    error = ClinicError(joined, filename=filename, lineno=line_number)
-    if fail:
-        raise error
-    else:
-        print(error.report(warn_only=True))
-
-
-def warn(
-    *args: object,
-    filename: str | None = None,
-    line_number: int | None = None,
-) -> None:
-    return warn_or_fail(*args, filename=filename, line_number=line_number, fail=False)
-
-def fail(
-    *args: object,
-    filename: str | None = None,
-    line_number: int | None = None,
-) -> NoReturn:
-    warn_or_fail(*args, filename=filename, line_number=line_number, fail=True)
-
-
 class CRenderData:
     def __init__(self) -> None:
 
diff --git a/Tools/clinic/libclinic/__init__.py b/Tools/clinic/libclinic/__init__.py
index 738864a..8efaad6 100644
--- a/Tools/clinic/libclinic/__init__.py
+++ b/Tools/clinic/libclinic/__init__.py
@@ -2,6 +2,8 @@
 
 from .errors import (
     ClinicError,
+    warn,
+    fail,
 )
 from .formatting import (
     SIG_END_MARKER,
@@ -32,6 +34,8 @@
 __all__ = [
     # Error handling
     "ClinicError",
+    "warn",
+    "fail",
 
     # Formatting helpers
     "SIG_END_MARKER",
diff --git a/Tools/clinic/libclinic/errors.py b/Tools/clinic/libclinic/errors.py
index afb21b0..f06bdfb 100644
--- a/Tools/clinic/libclinic/errors.py
+++ b/Tools/clinic/libclinic/errors.py
@@ -1,4 +1,5 @@
 import dataclasses as dc
+from typing import Literal,  NoReturn, overload
 
 
 @dc.dataclass
@@ -24,3 +25,48 @@ def report(self, *, warn_only: bool = False) -> str:
 
 class ParseError(ClinicError):
     pass
+
+
+@overload
+def warn_or_fail(
+    *args: object,
+    fail: Literal[True],
+    filename: str | None = None,
+    line_number: int | None = None,
+) -> NoReturn: ...
+
+@overload
+def warn_or_fail(
+    *args: object,
+    fail: Literal[False] = False,
+    filename: str | None = None,
+    line_number: int | None = None,
+) -> None: ...
+
+def warn_or_fail(
+    *args: object,
+    fail: bool = False,
+    filename: str | None = None,
+    line_number: int | None = None,
+) -> None:
+    joined = " ".join([str(a) for a in args])
+    error = ClinicError(joined, filename=filename, lineno=line_number)
+    if fail:
+        raise error
+    else:
+        print(error.report(warn_only=True))
+
+
+def warn(
+    *args: object,
+    filename: str | None = None,
+    line_number: int | None = None,
+) -> None:
+    return warn_or_fail(*args, filename=filename, line_number=line_number, fail=False)
+
+def fail(
+    *args: object,
+    filename: str | None = None,
+    line_number: int | None = None,
+) -> NoReturn:
+    warn_or_fail(*args, filename=filename, line_number=line_number, fail=True)