Skip to content

Commit 9a733c0

Browse files
committed
[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.
1 parent a1beb61 commit 9a733c0

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

llvm/include/llvm/Support/VersionTuple.h

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

101101
/// Return a version tuple that contains a different major version but
102102
/// everything else is the same.
103-
VersionTuple withMajorReplaced(unsigned NewMajor) const {
104-
return VersionTuple(NewMajor, Minor, Subminor, Build);
105-
}
103+
VersionTuple withMajorReplaced(unsigned NewMajor) const;
106104

107105
/// Return a version tuple that contains only components that are non-zero.
108106
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)