[llvm] 12e6622 - [Support] Avoid setting minor/subminor/build in VersionTuple::withMajorReplaced (#139318)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 9 16:56:23 PDT 2025
Author: Cyndy Ishida
Date: 2025-05-09T16:56:18-07:00
New Revision: 12e6622d4a6602e1c63b261b185eab136b4827de
URL: https://github.com/llvm/llvm-project/commit/12e6622d4a6602e1c63b261b185eab136b4827de
DIFF: https://github.com/llvm/llvm-project/commit/12e6622d4a6602e1c63b261b185eab136b4827de.diff
LOG: [Support] Avoid setting minor/subminor/build in VersionTuple::withMajorReplaced (#139318)
The expectation of this API is that it only changes the major version of
a preexisting version tuple. However, it was adding 0's, which caused
unintended changes in serialization or printing.
Instead, check for the existence of the non-major parts of the tuple.
Added:
Modified:
clang/test/Driver/xros-driver.c
llvm/include/llvm/Support/VersionTuple.h
llvm/lib/Support/VersionTuple.cpp
llvm/unittests/Support/VersionTupleTest.cpp
Removed:
################################################################################
diff --git a/clang/test/Driver/xros-driver.c b/clang/test/Driver/xros-driver.c
index dd2c55ed4e70c..a79b76d5fe0ba 100644
--- a/clang/test/Driver/xros-driver.c
+++ b/clang/test/Driver/xros-driver.c
@@ -30,8 +30,8 @@
// LINK: "-platform_version" "xros" "1.0.0" "1.0.0"
// LINK-SIM: "-platform_version" "xros-simulator" "1.0.0" "1.0.0"
-// OBJC-RUNTIME: "-fobjc-runtime=ios-17.0.0.0"
-// OBJC-RUNTIME2: "-fobjc-runtime=ios-18.0.0.0"
+// OBJC-RUNTIME: "-fobjc-runtime=ios-17.0.0"
+// OBJC-RUNTIME2: "-fobjc-runtime=ios-18.0.0"
// ARC-NOT: error:
// SSP_ON: "-stack-protector" "1"
diff --git a/llvm/include/llvm/Support/VersionTuple.h b/llvm/include/llvm/Support/VersionTuple.h
index 0a4623f049d28..aeb4798209203 100644
--- a/llvm/include/llvm/Support/VersionTuple.h
+++ b/llvm/include/llvm/Support/VersionTuple.h
@@ -100,9 +100,7 @@ class VersionTuple {
/// Return a version tuple that contains a
diff erent major version but
/// everything else is the same.
- VersionTuple withMajorReplaced(unsigned NewMajor) const {
- return VersionTuple(NewMajor, Minor, Subminor, Build);
- }
+ VersionTuple withMajorReplaced(unsigned NewMajor) const;
/// Return a version tuple that contains only components that are non-zero.
VersionTuple normalize() const {
diff --git a/llvm/lib/Support/VersionTuple.cpp b/llvm/lib/Support/VersionTuple.cpp
index a4224f23b2f94..c6e20f1bd3ef4 100644
--- a/llvm/lib/Support/VersionTuple.cpp
+++ b/llvm/lib/Support/VersionTuple.cpp
@@ -108,3 +108,13 @@ bool VersionTuple::tryParse(StringRef input) {
*this = VersionTuple(major, minor, micro, build);
return false;
}
+
+VersionTuple VersionTuple::withMajorReplaced(unsigned NewMajor) const {
+ if (HasBuild)
+ return VersionTuple(NewMajor, Minor, Subminor, Build);
+ if (HasSubminor)
+ return VersionTuple(NewMajor, Minor, Subminor);
+ if (HasMinor)
+ return VersionTuple(NewMajor, Minor);
+ return VersionTuple(NewMajor);
+}
diff --git a/llvm/unittests/Support/VersionTupleTest.cpp b/llvm/unittests/Support/VersionTupleTest.cpp
index af6c0a7febad5..d498d670fb710 100644
--- a/llvm/unittests/Support/VersionTupleTest.cpp
+++ b/llvm/unittests/Support/VersionTupleTest.cpp
@@ -47,3 +47,33 @@ TEST(VersionTuple, tryParse) {
EXPECT_TRUE(VT.tryParse("1 "));
EXPECT_TRUE(VT.tryParse("."));
}
+
+TEST(VersionTuple, withMajorReplaced) {
+ VersionTuple VT(2);
+ VersionTuple ReplacedVersion = VT.withMajorReplaced(7);
+ EXPECT_FALSE(ReplacedVersion.getMinor().has_value());
+ EXPECT_FALSE(ReplacedVersion.getSubminor().has_value());
+ EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
+ EXPECT_EQ(VersionTuple(7), ReplacedVersion);
+
+ VT = VersionTuple(100, 1);
+ ReplacedVersion = VT.withMajorReplaced(7);
+ EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
+ EXPECT_FALSE(ReplacedVersion.getSubminor().has_value());
+ EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
+ EXPECT_EQ(VersionTuple(7, 1), ReplacedVersion);
+
+ VT = VersionTuple(101, 11, 12);
+ ReplacedVersion = VT.withMajorReplaced(7);
+ EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
+ EXPECT_TRUE(ReplacedVersion.getSubminor().has_value());
+ EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
+ EXPECT_EQ(VersionTuple(7, 11, 12), ReplacedVersion);
+
+ VT = VersionTuple(101, 11, 12, 2);
+ ReplacedVersion = VT.withMajorReplaced(7);
+ EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
+ EXPECT_TRUE(ReplacedVersion.getSubminor().has_value());
+ EXPECT_TRUE(ReplacedVersion.getBuild().has_value());
+ EXPECT_EQ(VersionTuple(7, 11, 12, 2), ReplacedVersion);
+}
More information about the llvm-commits
mailing list