diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy
index c9dd108bf2d..cbaa5135c62 100644
--- a/src/Compiler/pars.fsy
+++ b/src/Compiler/pars.fsy
@@ -5266,15 +5266,99 @@ arrayTypeSuffix:
| LBRACK RBRACK
{ 1 }
- | LBRACK COMMA RBRACK
+ | LBRACK COMMA RBRACK
{ 2 }
- | LBRACK COMMA COMMA RBRACK
+ | LBRACK COMMA COMMA RBRACK
{ 3 }
- | LBRACK COMMA COMMA COMMA RBRACK
+ | LBRACK COMMA COMMA COMMA RBRACK
{ 4 }
+ | LBRACK COMMA COMMA COMMA COMMA RBRACK
+ { 5 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 6 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 7 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 8 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 9 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 10 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 11 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 12 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 13 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 14 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 15 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 16 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 17 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 18 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 19 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 20 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 21 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 22 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 23 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 24 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 25 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 26 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 27 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 28 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 29 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 30 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 31 }
+
+ | LBRACK COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA COMMA RBRACK
+ { 32 }
+
appTypePrefixArguments:
| typeArgActual COMMA typeArgActual typeArgListElements
{ let typeArgs, commas = $4 in $1 :: $3 :: List.rev typeArgs, (rhs parseState 2) :: (List.rev commas) }
diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
index 0b5e005d7b7..75e0f8a0323 100644
--- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
+++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
@@ -161,6 +161,7 @@
+
diff --git a/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs
new file mode 100644
index 00000000000..7a107e1e910
--- /dev/null
+++ b/tests/FSharp.Compiler.ComponentTests/Language/MultiDimensionalArrayTests.fs
@@ -0,0 +1,52 @@
+namespace FSharp.Compiler.ComponentTests.Language
+
+open Xunit
+open FSharp.Test.Compiler
+
+module MultiDimensionalArrayTests =
+
+ []
+ []
+ []
+ []
+ let ``MultiDimensional array type can be written with or without backticks`` (commas: int, shortcut: string) =
+ let commaString = System.String(',', commas)
+
+ FSharp
+ $"""
+module MultiDimArrayTests
+let backTickStyle : int ``[{commaString}]`` = Unchecked.defaultof<_>
+let cleanStyle : int [{commaString}] = backTickStyle
+let shortCutStyle : int {shortcut} = cleanStyle
+ """
+ |> compile
+ |> shouldSucceed
+
+ []
+ let ``Multidimensional array - reports an error if types are not matching`` () =
+ let commaString = System.String(',', 30)
+
+ FSharp
+ $"""
+module MultiDimArrayErrorTests
+let cleanStyle : int [{commaString}] = Unchecked.defaultof<_>
+let shortCutStyle : int array32d = cleanStyle
+ """
+ |> compile
+ |> shouldFail
+ |> withSingleDiagnostic (Error 1, Line 4, Col 36, Line 4, Col 46, "This expression was expected to have type
+ 'int array32d'
+but here has type
+ 'int array31d' ")
+
+ []
+ let ``Multidimensional with rank over 32 cannot be defined`` () =
+ let commaString = System.String(',', 42)
+
+ FSharp
+ $"""
+module MultiDimArrayErrorTests
+let cleanStyle : int [{commaString}] = Unchecked.defaultof<_>
+ """
+ |> compile
+ |> shouldFail
diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs
index d9cb28398b9..c5d8c5f53ba 100644
--- a/tests/service/Symbols.fs
+++ b/tests/service/Symbols.fs
@@ -361,3 +361,15 @@ let tester2: int Group = []
|> should equal expectedTypeFormat
| _ -> Assert.Fail (sprintf "Couldn't get member: %s" entityName)
)
+
+ []
+ let ``FsharpType.Format default to arrayNd shorthands for multidimensional arrays`` ([]rank) =
+ let commas = System.String(',', rank - 1)
+ let _, checkResults = getParseAndCheckResults $""" let myArr : int[{commas}] = Unchecked.defaultOf<_>"""
+ let symbolUse = findSymbolUseByName "myArr" checkResults
+ match symbolUse.Symbol with
+ | :? FSharpMemberOrFunctionOrValue as v ->
+ v.FullType.Format symbolUse.DisplayContext
+ |> shouldEqual $"int array{rank}d"
+
+ | other -> Assert.Fail(sprintf "myArr was supposed to be a value, but is %A" other)