some progress
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
index 4a0efff..578e241 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
@@ -34172,6 +34172,22 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/varrays")
+        @TestDataPath("$PROJECT_ROOT")
+        public class Varrays {
+            @Test
+            public void testAllFilesPresentInVarrays() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/varrays"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("vArraysTypeChecks.kt")
+            public void testVArraysTypeChecks() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/visibility")
         @TestDataPath("$PROJECT_ROOT")
         public class Visibility {
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
index 1e78a8f..aeeff7d 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
@@ -34268,6 +34268,22 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/varrays")
+        @TestDataPath("$PROJECT_ROOT")
+        public class Varrays {
+            @Test
+            public void testAllFilesPresentInVarrays() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/varrays"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("vArraysTypeChecks.kt")
+            public void testVArraysTypeChecks() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/visibility")
         @TestDataPath("$PROJECT_ROOT")
         public class Visibility {
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
index 8e4a1bc..aac2b61 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
@@ -34172,6 +34172,22 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/varrays")
+        @TestDataPath("$PROJECT_ROOT")
+        public class Varrays {
+            @Test
+            public void testAllFilesPresentInVarrays() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/varrays"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("vArraysTypeChecks.kt")
+            public void testVArraysTypeChecks() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/visibility")
         @TestDataPath("$PROJECT_ROOT")
         public class Visibility {
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirCastDiagnosticsHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirCastDiagnosticsHelpers.kt
index 6231a87..7780579 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirCastDiagnosticsHelpers.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirCastDiagnosticsHelpers.kt
@@ -114,7 +114,6 @@
 }
 
 fun isCastErased(supertype: ConeKotlinType, subtype: ConeKotlinType, context: CheckerContext): Boolean {
-    if ((subtype as? ConeClassLikeType)?.toSymbol(context.session)?.name == Name.identifier("VArray")) return false
     val typeContext = context.session.typeContext
 
     val isNonReifiedTypeParameter = subtype.isNonReifiedTypeParameter()
@@ -148,6 +147,13 @@
     // NOTE: this does not account for 'as Array<List<T>>'
     if (subtype.allParameterReified()) return false
 
+    if (subtype.isVArray) {
+        val argument = subtype.typeArguments.singleOrNull() ?: return false
+        if (argument.kind == ProjectionKind.INVARIANT && (argument.type?.isPrimitive == true) || (argument.type?.isUnsignedType == true)) {
+            return false
+        }
+    }
+
     val staticallyKnownSubtype = findStaticallyKnownSubtype(supertype, subtype, context)
 
     // If the substitution failed, it means that the result is an impossible type, e.g. something like Out<in Foo>
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirVArrayTypeArgumentReifiedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirVArrayTypeArgumentReifiedChecker.kt
index 23fce07..4a496c0 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirVArrayTypeArgumentReifiedChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirVArrayTypeArgumentReifiedChecker.kt
@@ -6,9 +6,11 @@
 package org.jetbrains.kotlin.fir.analysis.checkers.type
 
 import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
+import org.jetbrains.kotlin.diagnostics.reportOn
 import org.jetbrains.kotlin.fir.analysis.checkers.checkIfSuitableForReifiedTypeParameterAndReport
 import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
 import org.jetbrains.kotlin.fir.analysis.checkers.extractArgumentsTypeRefAndSource
+import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
 import org.jetbrains.kotlin.fir.types.*
 
 object FirVArrayTypeArgumentReifiedChecker : FirTypeRefChecker() {
@@ -17,6 +19,10 @@
         val type = (typeRef as? FirResolvedTypeRef)?.type ?: return
         val typeArgument = type.typeArguments.singleOrNull() ?: return
         val typeArgumentSource = extractArgumentsTypeRefAndSource(typeRef)?.singleOrNull()?.source ?: return
+        if (typeArgument.isStarProjection) {
+            reporter.reportOn(typeArgumentSource, FirErrors.ILLEGAL_PROJECTION_USAGE, context)
+            return
+        }
         checkIfSuitableForReifiedTypeParameterAndReport(typeArgument.type, typeArgumentSource, context, reporter)
     }
 }
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt b/compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt
new file mode 100644
index 0000000..6fd5a29
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt
@@ -0,0 +1,54 @@
+// FIR_IDENTICAL
+// WITH_STDLIB
+
+@JvmInline
+value class IcInt(val x: Int)
+
+@JvmInline
+value class IcIntN(val x: Int?)
+
+@JvmInline
+value class IcStr(val x: String)
+
+@JvmInline
+value class IcByteGeneric<T>(val x: Byte)
+
+// OK checks:
+
+fun checkBool(p: Any) = p is VArray<Boolean>
+fun checkByte(p: Any) = p is VArray<Byte>
+fun checkShort(p: Any) = p is VArray<Short>
+fun checkInt(p: Any) = p is VArray<Int>
+fun checkLong(p: Any) = p is VArray<Long>
+fun checkFloat(p: Any) = p is VArray<Float>
+fun checkDouble(p: Any) = p is VArray<Double>
+fun checkChar(p: Any) = p is VArray<Char>
+
+fun checkUByte(p: Any?) = p is VArray<UByte>
+fun checkUShort(p: Any?) = p is VArray<UShort>
+fun checkUInt(p: Any?) = p is VArray<UInt>
+fun checkULong(p: Any?) = p is VArray<ULong>
+
+
+// Forbidden checks:
+
+fun checkNoArg(p: Any?) = p is <!NO_TYPE_ARGUMENTS_ON_RHS!>VArray<!>
+fun checkTwoArg(p: Any?) = p is VArray<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Int, Int><!>
+
+fun checkIcInt(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<IcInt><!>
+
+fun checkUByteN(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<UByte?><!>
+fun checkUShortN(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<UShort?><!>
+fun checkUIntN(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<UInt?><!>
+fun checkULongN(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<ULong?><!>
+
+fun checkIcIntN(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<IcIntN><!>
+fun checkStr(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<String><!>
+fun checkIcStr(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<IcStr><!>
+fun checkIcByteGenericStar(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<IcByteGeneric<*>><!>
+fun checkIcByteGenericInt(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<IcByteGeneric<Int>><!>
+fun check2DVArray(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<VArray<Int>><!>
+fun checkIntIn(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<VArray<in Int>><!>
+fun checkIntOut(p: Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<VArray<out Int>><!>
+fun checkStar(p: Any?) = p is VArray<<!ILLEGAL_PROJECTION_USAGE!>*<!>>
+fun <T> checkT(p:Any?) = p is <!CANNOT_CHECK_FOR_ERASED!>VArray<<!TYPE_PARAMETER_AS_REIFIED!>T<!>><!>
\ No newline at end of file
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
index f777087..87246f8 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
@@ -34268,6 +34268,22 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/varrays")
+        @TestDataPath("$PROJECT_ROOT")
+        public class Varrays {
+            @Test
+            public void testAllFilesPresentInVarrays() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/varrays"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("vArraysTypeChecks.kt")
+            public void testVArraysTypeChecks() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/varrays/vArraysTypeChecks.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/visibility")
         @TestDataPath("$PROJECT_ROOT")
         public class Visibility {