[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