diff --git a/src/target/parser.rs b/src/target/parser.rs index 1a02dc44..295ce47b 100644 --- a/src/target/parser.rs +++ b/src/target/parser.rs @@ -337,6 +337,16 @@ impl<'a> TargetInfo<'a> { })?; (*vendor, *os, env, abi) } + // Five components; format is `arch-vendor-os-env+abi-sanitizer`. + [vendor, os, envabi, _sanitizer] => { + let (env, abi) = parse_envabi(envabi).ok_or_else(|| { + Error::new( + ErrorKind::UnknownTarget, + format!("unknown environment/ABI `{envabi}` in target `{target}`"), + ) + })?; + (*vendor, *os, env, abi) + } _ => { return Err(Error::new( ErrorKind::InvalidTarget, @@ -566,6 +576,21 @@ mod tests { assert!(matches!(err.kind, ErrorKind::UnknownTarget)); } + #[test] + fn sanitizer_targets() { + assert_eq!( + TargetInfo::from_rustc_target("x86_64-unknown-linux-gnu-asan").unwrap(), + TargetInfo { + full_arch: "x86_64", + arch: "x86_64", + vendor: "unknown", + os: "linux", + env: "gnu", + abi: "", + } + ); + } + // Used in .github/workflows/test-rustc-targets.yml #[test] #[cfg_attr(