diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp index e8172ebb25972..0863d9319acb4 100644 --- a/llvm/lib/TargetParser/RISCVISAInfo.cpp +++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp @@ -470,6 +470,10 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) { return createStringError(errc::invalid_argument, "extension lacks version in expected format"); + if (VersionStart == 0) + return createStringError(errc::invalid_argument, + "missing extension name"); + StringRef ExtName = Prefix.slice(0, VersionStart); StringRef MajorVersionStr = Prefix.slice(VersionStart, StringRef::npos); if (MajorVersionStr.getAsInteger(10, MajorVersion)) diff --git a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp index 3aa0178100abf..9e88b87df4e8a 100644 --- a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp +++ b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp @@ -45,6 +45,14 @@ TEST(ParseNormalizedArchString, RejectsMalformedInputs) { } } +TEST(ParseNormalizedArchString, OnlyVersion) { + for (StringRef Input : {"rv64i2p0_1p0", "rv32i2p0_1p0"}) { + EXPECT_EQ( + toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()), + "missing extension name"); + } +} + TEST(ParseNormalizedArchString, AcceptsValidBaseISAsAndSetsXLen) { auto MaybeRV32I = RISCVISAInfo::parseNormalizedArchString("rv32i2p0"); ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());