[clang] [llvm] [Support] Avoid setting minor/subminor/build in VersionTuple::withMajorReplaced (PR #139318)
Cyndy Ishida via llvm-commits
llvm-commits at lists.llvm.org
Fri May 9 13:04:35 PDT 2025
https://github.com/cyndyishida updated https://github.com/llvm/llvm-project/pull/139318
>From 9a733c05d8ab18c1a7c45fc159718994a544f722 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Fri, 9 May 2025 12:16:14 -0700
Subject: [PATCH 1/2] [llvm][Support] Avoid setting minor/subminor/build in
VersionTuple::withMajorReplaced
The expectation of this API is to only change the major version of a
preexisting version tuple. However, it was actually adding 0's which
causes unintended changes in serialization or printing.
Instead, check for the existing of the non-major parts of the tuple.
---
llvm/include/llvm/Support/VersionTuple.h | 4 +--
llvm/lib/Support/VersionTuple.cpp | 10 +++++++
llvm/unittests/Support/VersionTupleTest.cpp | 30 +++++++++++++++++++++
3 files changed, 41 insertions(+), 3 deletions(-)
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 different 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);
+}
>From 19e91ecc893129ac34802d74853d97169838f651 Mon Sep 17 00:00:00 2001
From: Cyndy Ishida <cyndy_ishida at apple.com>
Date: Fri, 9 May 2025 12:58:40 -0700
Subject: [PATCH 2/2] Fix tests
---
clang/test/Driver/xros-driver.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
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"
More information about the llvm-commits
mailing list