Skip to content

Commit 1314d31

Browse files
committed
Rewrite extract_version_range
1 parent 60fac34 commit 1314d31

File tree

2 files changed

+46
-23
lines changed

2 files changed

+46
-23
lines changed

src/tools/compiletest/src/header.rs

+31-23
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ impl EarlyProps {
133133
fn ignore_gdb(config: &Config, line: &str) -> bool {
134134
if let Some(actual_version) = config.gdb_version {
135135
if let Some(rest) = line.strip_prefix("min-gdb-version:").map(str::trim) {
136-
let (start_ver, end_ver) = extract_version_range(rest, extract_gdb_version);
136+
let (start_ver, end_ver) = extract_version_range(rest, extract_gdb_version)
137+
.unwrap_or_else(|| {
138+
panic!("couldn't parse version range: {:?}", rest);
139+
});
137140

138141
if start_ver != end_ver {
139142
panic!("Expected single GDB version")
@@ -143,7 +146,9 @@ impl EarlyProps {
143146
return actual_version < start_ver;
144147
} else if let Some(rest) = line.strip_prefix("ignore-gdb-version:").map(str::trim) {
145148
let (min_version, max_version) =
146-
extract_version_range(rest, extract_gdb_version);
149+
extract_version_range(rest, extract_gdb_version).unwrap_or_else(|| {
150+
panic!("couldn't parse version range: {:?}", rest);
151+
});
147152

148153
if max_version < min_version {
149154
panic!("Malformed GDB version range: max < min")
@@ -197,7 +202,10 @@ impl EarlyProps {
197202
} else if let Some(rest) = line.strip_prefix("ignore-llvm-version:").map(str::trim)
198203
{
199204
// Syntax is: "ignore-llvm-version: <version1> [- <version2>]"
200-
let (v_min, v_max) = extract_version_range(rest, extract_llvm_version);
205+
let (v_min, v_max) = extract_version_range(rest, extract_llvm_version)
206+
.unwrap_or_else(|| {
207+
panic!("couldn't parse version range: {:?}", rest);
208+
});
201209
if v_max < v_min {
202210
panic!("Malformed LLVM version range: max < min")
203211
}
@@ -940,28 +948,28 @@ pub fn extract_llvm_version(version: &str) -> Option<u32> {
940948
// tuple: (<version1> as u32, <version2> as u32)
941949
// If the <version2> part is omitted, the second component of the tuple
942950
// is the same as <version1>.
943-
fn extract_version_range<F>(line: &str, parse: F) -> (u32, u32)
951+
fn extract_version_range<F>(line: &str, parse: F) -> Option<(u32, u32)>
944952
where
945953
F: Fn(&str) -> Option<u32>,
946954
{
947-
let range_components = line
948-
.split(&[' ', '-'][..])
949-
.filter(|word| !word.is_empty())
950-
.map(parse)
951-
.skip_while(Option::is_none)
952-
.take(3) // 3 or more = invalid, so take at most 3.
953-
.collect::<Vec<Option<u32>>>();
954-
955-
match *range_components {
956-
[v] => {
957-
let v = v.unwrap();
958-
(v, v)
959-
}
960-
[min, max] => {
961-
let v_min = min.unwrap();
962-
let v_max = max.expect("Malformed version directive");
963-
(v_min, v_max)
964-
}
965-
_ => panic!("Malformed version directive"),
955+
let mut splits = line.splitn(2, "- ").map(str::trim);
956+
let min = splits.next().unwrap();
957+
if min.ends_with('-') {
958+
return None;
959+
}
960+
961+
let max = splits.next();
962+
963+
if min.is_empty() {
964+
return None;
966965
}
966+
967+
let min = parse(min)?;
968+
let max = match max {
969+
Some(max) if max.is_empty() => return None,
970+
Some(max) => parse(max)?,
971+
_ => min,
972+
};
973+
974+
Some((min, max))
967975
}

src/tools/compiletest/src/header/tests.rs

+15
Original file line numberDiff line numberDiff line change
@@ -220,3 +220,18 @@ fn sanitizers() {
220220
assert!(parse_rs(&config, "// needs-sanitizer-memory").ignore);
221221
assert!(parse_rs(&config, "// needs-sanitizer-thread").ignore);
222222
}
223+
224+
#[test]
225+
fn test_extract_version_range() {
226+
use super::{extract_llvm_version, extract_version_range};
227+
228+
assert_eq!(extract_version_range("1.2.3 - 4.5.6", extract_llvm_version), Some((10203, 40506)));
229+
assert_eq!(extract_version_range("0 - 4.5.6", extract_llvm_version), Some((0, 40506)));
230+
assert_eq!(extract_version_range("1.2.3 -", extract_llvm_version), None);
231+
assert_eq!(extract_version_range("1.2.3 - ", extract_llvm_version), None);
232+
assert_eq!(extract_version_range("- 4.5.6", extract_llvm_version), None);
233+
assert_eq!(extract_version_range("-", extract_llvm_version), None);
234+
assert_eq!(extract_version_range(" - 4.5.6", extract_llvm_version), None);
235+
assert_eq!(extract_version_range(" - 4.5.6", extract_llvm_version), None);
236+
assert_eq!(extract_version_range("0 -", extract_llvm_version), None);
237+
}

0 commit comments

Comments
 (0)