Merge "Fix riscv64 stpcpy()." into main
diff --git a/libc/arch-riscv64/string/stpcpy_vext.S b/libc/arch-riscv64/string/stpcpy_vext.S
index 3096e76..e089938 100644
--- a/libc/arch-riscv64/string/stpcpy_vext.S
+++ b/libc/arch-riscv64/string/stpcpy_vext.S
@@ -83,8 +83,9 @@
add pDstPtr, pDstPtr, iCurrentVL
bltz iActiveElemPos, L(stpcpy_loop)
- // stpcpy() returns a pointer to the '\0', not the byte after it.
- addi pDstPtr, pDstPtr, -1
+ // stpcpy() returns a pointer to the '\0' in the destination.
+ sub pDstPtr, pDstPtr, iCurrentVL
+ add pDstPtr, pDstPtr, iActiveElemPos
ret
END(stpcpy_vext)
diff --git a/tests/string_test.cpp b/tests/string_test.cpp
index 4cd89cc..6e1fcfc 100644
--- a/tests/string_test.cpp
+++ b/tests/string_test.cpp
@@ -319,33 +319,34 @@
// one byte target with "\0" source
TEST(STRING_TEST, stpcpy2) {
char buf[1];
+ memset(buf, 'A', sizeof(buf));
char* orig = strdup("");
- ASSERT_EQ(buf, stpcpy(buf, orig));
- ASSERT_EQ('\0', buf[0]);
+ EXPECT_EQ(buf, stpcpy(buf, orig));
+ EXPECT_EQ('\0', buf[0]);
free(orig);
}
// multibyte target where we under fill target
TEST(STRING_TEST, stpcpy3) {
char buf[10];
- char* orig = strdup("12345");
memset(buf, 'A', sizeof(buf));
- ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig));
- ASSERT_STREQ("12345", buf);
- ASSERT_EQ('A', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
+ char* orig = strdup("12345");
+ EXPECT_EQ(buf+strlen(orig), stpcpy(buf, orig));
+ EXPECT_STREQ("12345", buf);
+ EXPECT_EQ('A', buf[6]);
+ EXPECT_EQ('A', buf[7]);
+ EXPECT_EQ('A', buf[8]);
+ EXPECT_EQ('A', buf[9]);
free(orig);
}
// multibyte target where we fill target exactly
TEST(STRING_TEST, stpcpy4) {
char buf[10];
- char* orig = strdup("123456789");
memset(buf, 'A', sizeof(buf));
- ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig));
- ASSERT_STREQ("123456789", buf);
+ char* orig = strdup("123456789");
+ EXPECT_EQ(buf+strlen(orig), stpcpy(buf, orig));
+ EXPECT_STREQ("123456789", buf);
free(orig);
}