Skip to content

Commit c467511

Browse files
committed
[Support] Avoid setting minor/subminor/build in VersionTuple::withMajorReplaced (llvm#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. (cherry picked from commit 12e6622)
1 parent 9c5c14d commit c467511

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

clang/test/Driver/xros-driver.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
// LINK: "-platform_version" "xros" "1.0.0" "1.0.0"
3131
// LINK-SIM: "-platform_version" "xros-simulator" "1.0.0" "1.0.0"
3232

33-
// OBJC-RUNTIME: "-fobjc-runtime=ios-17.0.0.0"
34-
// OBJC-RUNTIME2: "-fobjc-runtime=ios-18.0.0.0"
33+
// OBJC-RUNTIME: "-fobjc-runtime=ios-17.0.0"
34+
// OBJC-RUNTIME2: "-fobjc-runtime=ios-18.0.0"
3535
// ARC-NOT: error:
3636

3737
// SSP_ON: "-stack-protector" "1"

llvm/include/llvm/Support/VersionTuple.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ class VersionTuple {
103103

104104
/// Return a version tuple that contains a different major version but
105105
/// everything else is the same.
106-
VersionTuple withMajorReplaced(unsigned NewMajor) const {
107-
return VersionTuple(NewMajor, Minor, Subminor, Build);
108-
}
106+
VersionTuple withMajorReplaced(unsigned NewMajor) const;
109107

110108
/// Return a version tuple that contains only components that are non-zero.
111109
VersionTuple normalize() const {

llvm/lib/Support/VersionTuple.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,13 @@ bool VersionTuple::tryParse(StringRef input) {
108108
*this = VersionTuple(major, minor, micro, build);
109109
return false;
110110
}
111+
112+
VersionTuple VersionTuple::withMajorReplaced(unsigned NewMajor) const {
113+
if (HasBuild)
114+
return VersionTuple(NewMajor, Minor, Subminor, Build);
115+
if (HasSubminor)
116+
return VersionTuple(NewMajor, Minor, Subminor);
117+
if (HasMinor)
118+
return VersionTuple(NewMajor, Minor);
119+
return VersionTuple(NewMajor);
120+
}

llvm/unittests/Support/VersionTupleTest.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,33 @@ TEST(VersionTuple, tryParse) {
4747
EXPECT_TRUE(VT.tryParse("1 "));
4848
EXPECT_TRUE(VT.tryParse("."));
4949
}
50+
51+
TEST(VersionTuple, withMajorReplaced) {
52+
VersionTuple VT(2);
53+
VersionTuple ReplacedVersion = VT.withMajorReplaced(7);
54+
EXPECT_FALSE(ReplacedVersion.getMinor().has_value());
55+
EXPECT_FALSE(ReplacedVersion.getSubminor().has_value());
56+
EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
57+
EXPECT_EQ(VersionTuple(7), ReplacedVersion);
58+
59+
VT = VersionTuple(100, 1);
60+
ReplacedVersion = VT.withMajorReplaced(7);
61+
EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
62+
EXPECT_FALSE(ReplacedVersion.getSubminor().has_value());
63+
EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
64+
EXPECT_EQ(VersionTuple(7, 1), ReplacedVersion);
65+
66+
VT = VersionTuple(101, 11, 12);
67+
ReplacedVersion = VT.withMajorReplaced(7);
68+
EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
69+
EXPECT_TRUE(ReplacedVersion.getSubminor().has_value());
70+
EXPECT_FALSE(ReplacedVersion.getBuild().has_value());
71+
EXPECT_EQ(VersionTuple(7, 11, 12), ReplacedVersion);
72+
73+
VT = VersionTuple(101, 11, 12, 2);
74+
ReplacedVersion = VT.withMajorReplaced(7);
75+
EXPECT_TRUE(ReplacedVersion.getMinor().has_value());
76+
EXPECT_TRUE(ReplacedVersion.getSubminor().has_value());
77+
EXPECT_TRUE(ReplacedVersion.getBuild().has_value());
78+
EXPECT_EQ(VersionTuple(7, 11, 12, 2), ReplacedVersion);
79+
}

0 commit comments

Comments
 (0)