From 7a14f9ed4fa60f4d8fc042fc678c80c14a850dc0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 18 Jan 2020 23:00:30 +0100 Subject: [PATCH] Fix LLVM version handling in compiletest Convert version string to integer before comparing. Otherwise we get into trouble with double digit versions ;) --- src/tools/compiletest/src/header.rs | 27 ++++++++++++++++++----- src/tools/compiletest/src/header/tests.rs | 5 ++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 2a24a8c3c9485..cb648db8830ef 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -191,6 +191,7 @@ impl EarlyProps { return true; } if let Some(ref actual_version) = config.llvm_version { + let actual_version = version_to_int(actual_version); if line.starts_with("min-llvm-version") { let min_version = line .trim_end() @@ -199,7 +200,7 @@ impl EarlyProps { .expect("Malformed llvm version directive"); // Ignore if actual version is smaller the minimum required // version - &actual_version[..] < min_version + actual_version < version_to_int(min_version) } else if line.starts_with("min-system-llvm-version") { let min_version = line .trim_end() @@ -208,7 +209,7 @@ impl EarlyProps { .expect("Malformed llvm version directive"); // Ignore if using system LLVM and actual version // is smaller the minimum required version - config.system_llvm && &actual_version[..] < min_version + config.system_llvm && actual_version < version_to_int(min_version) } else if line.starts_with("ignore-llvm-version") { // Syntax is: "ignore-llvm-version [- ]" let range_components = line @@ -219,15 +220,15 @@ impl EarlyProps { .take(3) // 3 or more = invalid, so take at most 3. .collect::>(); match range_components.len() { - 1 => &actual_version[..] == range_components[0], + 1 => actual_version == version_to_int(range_components[0]), 2 => { - let v_min = range_components[0]; - let v_max = range_components[1]; + let v_min = version_to_int(range_components[0]); + let v_max = version_to_int(range_components[1]); if v_max < v_min { panic!("Malformed LLVM version range: max < min") } // Ignore if version lies inside of range. - &actual_version[..] >= v_min && &actual_version[..] <= v_max + actual_version >= v_min && actual_version <= v_max } _ => panic!("Malformed LLVM version directive"), } @@ -238,6 +239,20 @@ impl EarlyProps { false } } + + fn version_to_int(version: &str) -> u32 { + let version_without_suffix = version.split('-').next().unwrap(); + let components: Vec = version_without_suffix + .split('.') + .map(|s| s.parse().expect("Malformed version component")) + .collect(); + match components.len() { + 1 => components[0] * 10000, + 2 => components[0] * 10000 + components[1] * 100, + 3 => components[0] * 10000 + components[1] * 100 + components[2], + _ => panic!("Malformed version"), + } + } } } diff --git a/src/tools/compiletest/src/header/tests.rs b/src/tools/compiletest/src/header/tests.rs index 6c478f7e29da4..31d991e0c2f87 100644 --- a/src/tools/compiletest/src/header/tests.rs +++ b/src/tools/compiletest/src/header/tests.rs @@ -122,9 +122,8 @@ fn llvm_version() { config.llvm_version = Some("9.3.1-rust-1.43.0-dev".to_owned()); assert!(!parse_rs(&config, "// min-llvm-version 9.2").ignore); - // FIXME. - // config.llvm_version = Some("10.0.0-rust".to_owned()); - // assert!(!parse_rs(&config, "// min-llvm-version 9.0").ignore); + config.llvm_version = Some("10.0.0-rust".to_owned()); + assert!(!parse_rs(&config, "// min-llvm-version 9.0").ignore); } #[test]