diff --git a/compiler/GHC/Utils/Logger.hs b/compiler/GHC/Utils/Logger.hs
index 97753fe850f63d8fbb4dc8e77b449bd3c9ec45d5..25135d6318935aedbd723cf72817f2c01021e99c 100644
--- a/compiler/GHC/Utils/Logger.hs
+++ b/compiler/GHC/Utils/Logger.hs
@@ -417,14 +417,13 @@ defaultLogAction logflags msg_class srcSpan msg
       message = mkLocMessageWarningGroups (log_show_warn_groups logflags) msg_class srcSpan msg
 
       printDiagnostics = do
-        hPutChar stderr '\n'
         caretDiagnostic <-
             if log_show_caret logflags
             then getCaretDiagnostic msg_class srcSpan
             else pure empty
         printErrs $ getPprStyle $ \style ->
           withPprStyle (setStyleColoured True style)
-            (message $+$ caretDiagnostic)
+            (message $+$ caretDiagnostic $+$ blankLine)
         -- careful (#2302): printErrs prints in UTF-8,
         -- whereas converting to string first and using
         -- hPutStr would just emit the low 8 bits of
diff --git a/testsuite/tests/ghci/prog018/prog018.stdout b/testsuite/tests/ghci/prog018/prog018.stdout
index c2a118fb5efbf25a68f9a925866d72dbbadefc73..1520edd96a0d9a6d991b1898f5a650801a227d2f 100644
--- a/testsuite/tests/ghci/prog018/prog018.stdout
+++ b/testsuite/tests/ghci/prog018/prog018.stdout
@@ -1,7 +1,6 @@
 [1 of 3] Compiling A                ( A.hs, interpreted )
 [2 of 3] Compiling B                ( B.hs, interpreted )
 [3 of 3] Compiling C                ( C.hs, interpreted )
-
 A.hs:5:1: warning: [GHC-62161] [-Wincomplete-patterns (in -Wextra)]
     Pattern match(es) are non-exhaustive
     In an equation for ‘incompletePattern’:
@@ -17,9 +16,10 @@ B.hs:7:1: warning: [GHC-66111] [-Wunused-imports (in -Wextra)]
 
 C.hs:6:7: error: [GHC-88464]
     Variable not in scope: variableNotInScope :: ()
+
 Failed, two modules loaded.
 [3 of 3] Compiling C                ( C.hs, interpreted )
-
 C.hs:6:7: error: [GHC-88464]
     Variable not in scope: variableNotInScope :: ()
+
 Failed, two modules reloaded.
diff --git a/testsuite/tests/ghci/scripts/T9140.stdout b/testsuite/tests/ghci/scripts/T9140.stdout
index 29219a2312594c536c123e2ac3575b12a0d66f10..3f9f01045c8c0018b7ff5db1f683ab412d031684 100644
--- a/testsuite/tests/ghci/scripts/T9140.stdout
+++ b/testsuite/tests/ghci/scripts/T9140.stdout
@@ -1,4 +1,3 @@
-
 <interactive>:2:5: error: [GHC-20036]
     You can't mix polymorphic and unlifted bindings: a = (# 1 #)
     Suggested fix: Add a type signature.
@@ -10,3 +9,4 @@
 <interactive>:1:1: error: [GHC-17999]
     GHCi can't bind a variable of unlifted type:
       a :: (# Integer, Integer #)
+
diff --git a/testsuite/tests/layout/layout001.stdout b/testsuite/tests/layout/layout001.stdout
index 8d4ee0d1be559e12fd76298e76043521d2cd86b5..c4c4781ffa3ed1694cacc0af99b8b0a4682a0f43 100644
--- a/testsuite/tests/layout/layout001.stdout
+++ b/testsuite/tests/layout/layout001.stdout
@@ -1,9 +1,9 @@
 Running with -XNoAlternativeLayoutRule
 Running with -XAlternativeLayoutRule
-
 layout001.hs:6:3: error: [GHC-58481] parse error on input ‘where’
-Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 
+Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 layout001.hs:6:3: warning: [GHC-93617] [-Walternative-layout-rule-transitional (in -Wdefault)]
     transitional layout will not be accepted in the future:
     `where' clause at the same depth as implicit layout block
+
diff --git a/testsuite/tests/layout/layout003.stdout b/testsuite/tests/layout/layout003.stdout
index 2a9d2c57cf6c05ac056ac69cf0fc0bfc0cade7a4..71210f6ed72cb78f8fef775759e7b91c6eeed159 100644
--- a/testsuite/tests/layout/layout003.stdout
+++ b/testsuite/tests/layout/layout003.stdout
@@ -1,9 +1,9 @@
 Running with -XNoAlternativeLayoutRule
 Running with -XAlternativeLayoutRule
-
 layout003.hs:11:4: error: [GHC-58481] parse error on input ‘|’
-Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 
+Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 layout003.hs:11:4: warning: [GHC-93617] [-Walternative-layout-rule-transitional (in -Wdefault)]
     transitional layout will not be accepted in the future:
     `|' at the same depth as implicit layout block
+
diff --git a/testsuite/tests/layout/layout004.stdout b/testsuite/tests/layout/layout004.stdout
index e300472205ffda30804ac69dba6e02d50d850c68..3a1a3f8b7025e2f47cabcb17302069083cf8fcaa 100644
--- a/testsuite/tests/layout/layout004.stdout
+++ b/testsuite/tests/layout/layout004.stdout
@@ -1,7 +1,7 @@
 Running with -XNoAlternativeLayoutRule
 Running with -XAlternativeLayoutRule
-
 layout004.hs:7:14: error: [GHC-58481] parse error on input ‘,’
-Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 
+Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 layout004.hs:7:14: error: [GHC-58481] parse error on input ‘,’
+
diff --git a/testsuite/tests/layout/layout006.stdout b/testsuite/tests/layout/layout006.stdout
index bb6ac253116359b9283324afd6e51323a2b048f6..14adb0f0072b573abc24de82891d8de20d3b27be 100644
--- a/testsuite/tests/layout/layout006.stdout
+++ b/testsuite/tests/layout/layout006.stdout
@@ -1,13 +1,12 @@
 Running with -XNoAlternativeLayoutRule
-
 layout006.hs:12:4: warning: [GHC-53633] [-Woverlapping-patterns (in -Wdefault)]
     Pattern match is redundant
     In an equation for ‘f’: f | True = ...
-Running with -XAlternativeLayoutRule
 
+Running with -XAlternativeLayoutRule
 layout006.hs:12:2: error: [GHC-58481] parse error on input ‘|’
-Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 
+Running with -XAlternativeLayoutRule -XAlternativeLayoutRuleTransitional
 layout006.hs:12:2: warning: [GHC-93617] [-Walternative-layout-rule-transitional (in -Wdefault)]
     transitional layout will not be accepted in the future:
     `|' at the same depth as implicit layout block
@@ -15,3 +14,4 @@ layout006.hs:12:2: warning: [GHC-93617] [-Walternative-layout-rule-transitional
 layout006.hs:12:4: warning: [GHC-53633] [-Woverlapping-patterns (in -Wdefault)]
     Pattern match is redundant
     In an equation for ‘f’: f | True = ...
+
diff --git a/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout b/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
index f68331068faa7921b2e1fa2333d8f50271fe9b61..07f87a200df1a385f369898b0e2b4fc5fa5ccb73 100644
--- a/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
+++ b/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
@@ -1,10 +1,10 @@
 GHCiDRF.foo :: T -> Int
-
 <interactive>:1:1: error: [GHC-87543]
     Ambiguous occurrence ‘GHCiDRF.bar’.
     It could refer to
        either the field ‘bar’ of record ‘T’, defined at GHCiDRF.hs:3:28,
            or the field ‘bar’ of record ‘U’, defined at GHCiDRF.hs:4:16.
+
 type T :: *
 data T = MkT {foo :: Int, ...}
   	-- Defined at GHCiDRF.hs:3:16
@@ -16,7 +16,6 @@ type U :: *
 data U = MkU {bar :: Bool}
   	-- Defined at GHCiDRF.hs:4:16
 GHCiDRF.foo :: GHCiDRF.T -> Int
-
 <interactive>:1:1: error: [GHC-87543]
     Ambiguous occurrence ‘GHCiDRF.bar’.
     It could refer to
@@ -26,6 +25,7 @@ GHCiDRF.foo :: GHCiDRF.T -> Int
            or the field ‘bar’ belonging to data constructor ‘MkU’,
               imported qualified from ‘GHCiDRF’
               (and originally defined at GHCiDRF.hs:4:16-18).
+
 type GHCiDRF.T :: *
 data GHCiDRF.T = GHCiDRF.MkT {GHCiDRF.foo :: Int, ...}
   	-- Defined at GHCiDRF.hs:3:16
@@ -36,7 +36,6 @@ data GHCiDRF.T = GHCiDRF.MkT {..., GHCiDRF.bar :: Int}
 type GHCiDRF.U :: *
 data GHCiDRF.U = GHCiDRF.MkU {GHCiDRF.bar :: Bool}
   	-- Defined at GHCiDRF.hs:4:16
-
 <interactive>:11:1: error: [GHC-87543]
     Ambiguous occurrence ‘GHCiDRF.bar’.
     It could refer to
@@ -46,3 +45,4 @@ data GHCiDRF.U = GHCiDRF.MkU {GHCiDRF.bar :: Bool}
            or the field ‘bar’ belonging to data constructor ‘MkU’,
               imported qualified from ‘GHCiDRF’
               (and originally defined at GHCiDRF.hs:4:16-18).
+
diff --git a/testsuite/tests/overloadedrecflds/ghci/T19314.stdout b/testsuite/tests/overloadedrecflds/ghci/T19314.stdout
index 1ec0c97201dd711ca0725cad9789a602d4bb35ce..6822769c9c9c09e62185714db2a16d18c4656cc1 100644
--- a/testsuite/tests/overloadedrecflds/ghci/T19314.stdout
+++ b/testsuite/tests/overloadedrecflds/ghci/T19314.stdout
@@ -1,6 +1,5 @@
 w :: [a] -> a
 x :: [a] -> a
-
 <interactive>:1:1: error: [GHC-88464]
     Variable not in scope: y
     Suggested fix:
@@ -12,3 +11,4 @@ x :: [a] -> a
     Suggested fix:
       Notice that ‘z’ is a field selector
       that has been suppressed by NoFieldSelectors.
+
diff --git a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
index c13d87bb8ebab9d5776f477b2ecf1a79e9ab32aa..945241590f5c26c3944e21dc68c41ee36b568264 100644
--- a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
+++ b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
@@ -7,7 +7,6 @@ type T :: * -> *
 data T a = MkT {foo :: Bool, ...}
   	-- Defined at <interactive>:4:18
 True
-
 <interactive>:1:1: error: [GHC-87543]
     Ambiguous occurrence ‘foo’.
     It could refer to
@@ -15,6 +14,7 @@ True
               defined at <interactive>:3:16,
            or the field ‘foo’ of record ‘T’,
               defined at <interactive>:4:18.
+
 type U :: *
 data U = MkU {foo :: Int}
   	-- Defined at <interactive>:12:16
diff --git a/testsuite/tests/rename/should_compile/T13839.stdout b/testsuite/tests/rename/should_compile/T13839.stdout
index 0752cb6286814d3d81ab384e333e8a6b8c78136e..8be6d2b3d2147a3e4af3090c0b9d98bd382d4c2e 100644
--- a/testsuite/tests/rename/should_compile/T13839.stdout
+++ b/testsuite/tests/rename/should_compile/T13839.stdout
@@ -1,5 +1,5 @@
-
 T13839a.hs:10:1: warning: [GHC-40910] [-Wunused-top-binds (in -Wextra, -Wunused-binds)]
     Defined but not used: ‘nonUsed’
+
 nonUsed :: ()
 nonUsed :: ()
diff --git a/testsuite/tests/th/T7276a.stdout b/testsuite/tests/th/T7276a.stdout
index a199732f6f8ce5447d5b13366218ebacbe835727..5140f025794c9216c3b65b137191ee57f8dc3770 100644
--- a/testsuite/tests/th/T7276a.stdout
+++ b/testsuite/tests/th/T7276a.stdout
@@ -1,4 +1,3 @@
-
 <interactive>:3:9: warning: [GHC-83865] [-Wdeferred-type-errors (in -Wdefault)]
     • Couldn't match type ‘[Dec]’ with ‘Exp’
       Expected: Q Exp
@@ -17,3 +16,4 @@
 (deferred type error)
       Code: x
     • In the untyped splice: $x
+
diff --git a/testsuite/tests/warnings/should_fail/CaretDiagnostics1.stderr b/testsuite/tests/warnings/should_fail/CaretDiagnostics1.stderr
index b3f74bae0dbb35b22772149ded7993f2477ff2f4..c8967e5928fedb361c7cdecd8375b2be94008eeb 100644
--- a/testsuite/tests/warnings/should_fail/CaretDiagnostics1.stderr
+++ b/testsuite/tests/warnings/should_fail/CaretDiagnostics1.stderr
@@ -1,4 +1,3 @@
-
 CaretDiagnostics1.hs:7:8-15: error: [GHC-83865]
     • Couldn't match expected type ‘IO a0’ with actual type ‘Int’
     • In the second argument of ‘(+)’, namely ‘(3 :: Int)’
@@ -68,3 +67,4 @@ CaretDiagnostics1.hs:23:25-26: error: [GHC-83865]
    |
 23 | tabby2 =                ()
    |                         ^^
+