if (__compiletime_lessthan(p_size, size))
                __write_overflow();
 
+       /* Short-circuit for compile-time known-safe lengths. */
+       if (__compiletime_lessthan(p_size, SIZE_MAX)) {
+               len = __compiletime_strlen(q);
+
+               if (len < SIZE_MAX && __compiletime_lessthan(len, size)) {
+                       __underlying_memcpy(p, q, len + 1);
+                       return len;
+               }
+       }
+
        /*
         * This call protects from read overflow, because len will default to q
         * length if it smaller than size.
 
 
 static void strscpy_test(struct kunit *test)
 {
+       char dest[8];
+
        /*
         * tc() uses a destination buffer of size 6 and needs at
         * least 2 characters spare (one for null and one to check for
        tc(test, "ab",   4, 2,      2, 1, 1);
        tc(test, "a",    4, 1,      1, 1, 2);
        tc(test, "",     4, 0,      0, 1, 3);
+
+       /* Compile-time-known source strings. */
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "", ARRAY_SIZE(dest)), 0);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "", 3), 0);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "", 1), 0);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "", 0), -E2BIG);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "Fixed", ARRAY_SIZE(dest)), 5);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "Fixed", 3), -E2BIG);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "Fixed", 1), -E2BIG);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "Fixed", 0), -E2BIG);
+       KUNIT_EXPECT_EQ(test, strscpy(dest, "This is too long", ARRAY_SIZE(dest)), -E2BIG);
 }
 
 static struct kunit_case strscpy_test_cases[] = {