Skip to content

Commit d5e93fd

Browse files
committed
fixes for test cases; move test to satisfy tidy
1 parent 7c0ef85 commit d5e93fd

File tree

3 files changed

+71
-52
lines changed

3 files changed

+71
-52
lines changed

compiler/rustc_lint/src/builtin.rs

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2880,29 +2880,56 @@ enum AsmLabelKind {
28802880
/// These follow the pattern: `[letter][digit(s)]:[digit(s)][optional_suffix]`
28812881
///
28822882
/// Returns `true` if the string matches a valid Hexagon register span pattern.
2883-
fn is_hexagon_register_span(possible_label: &str) -> bool {
2884-
if possible_label.len() < 3 {
2883+
pub fn is_hexagon_register_span(possible_label: &str) -> bool {
2884+
// Extract the full register span from the context
2885+
if let Some(colon_idx) = possible_label.find(':') {
2886+
let after_colon = &possible_label[colon_idx + 1..];
2887+
is_hexagon_register_span_impl(&possible_label[..colon_idx], after_colon)
2888+
} else {
2889+
false
2890+
}
2891+
}
2892+
2893+
/// Helper function for use within the lint when we have statement context.
2894+
fn is_hexagon_register_span_context(
2895+
possible_label: &str,
2896+
statement: &str,
2897+
colon_idx: usize,
2898+
) -> bool {
2899+
// Extract what comes after the colon in the statement
2900+
let after_colon_start = colon_idx + 1;
2901+
if after_colon_start >= statement.len() {
28852902
return false;
28862903
}
28872904

2888-
let mut chars = possible_label.chars();
2905+
// Get the part after the colon, up to the next whitespace or special character
2906+
let after_colon_full = &statement[after_colon_start..];
2907+
let after_colon = after_colon_full
2908+
.chars()
2909+
.take_while(|&c| c.is_ascii_alphanumeric() || c == '.')
2910+
.collect::<String>();
2911+
2912+
is_hexagon_register_span_impl(possible_label, &after_colon)
2913+
}
2914+
2915+
/// Core implementation for checking hexagon register spans.
2916+
fn is_hexagon_register_span_impl(before_colon: &str, after_colon: &str) -> bool {
2917+
if before_colon.len() < 1 || after_colon.is_empty() {
2918+
return false;
2919+
}
2920+
2921+
let mut chars = before_colon.chars();
28892922
let start = chars.next().unwrap();
28902923

28912924
// Must start with a letter (r, V, p, etc.)
28922925
if !start.is_ascii_alphabetic() {
28932926
return false;
28942927
}
28952928

2896-
let rest = &possible_label[1..];
2897-
let Some(colon_idx) = rest.find(':') else {
2898-
return false;
2899-
};
2900-
2901-
let (before_colon, after_colon_with_colon) = rest.split_at(colon_idx);
2902-
let after_colon = &after_colon_with_colon[1..]; // Skip the ':'
2929+
let rest = &before_colon[1..];
29032930

2904-
// Check if before colon is all digits and non-empty
2905-
if before_colon.is_empty() || !before_colon.chars().all(|c| c.is_ascii_digit()) {
2931+
// Check if the part after the first letter is all digits and non-empty
2932+
if rest.is_empty() || !rest.chars().all(|c| c.is_ascii_digit()) {
29062933
return false;
29072934
}
29082935

@@ -2912,39 +2939,6 @@ fn is_hexagon_register_span(possible_label: &str) -> bool {
29122939
!digits_after.is_empty()
29132940
}
29142941

2915-
#[cfg(test)]
2916-
mod tests {
2917-
use super::is_hexagon_register_span;
2918-
2919-
#[test]
2920-
fn test_hexagon_register_span_patterns() {
2921-
// Valid Hexagon register span patterns
2922-
assert!(is_hexagon_register_span("r1:0"));
2923-
assert!(is_hexagon_register_span("r15:14"));
2924-
assert!(is_hexagon_register_span("V5:4"));
2925-
assert!(is_hexagon_register_span("V3:2"));
2926-
assert!(is_hexagon_register_span("V5:4.w"));
2927-
assert!(is_hexagon_register_span("V3:2.h"));
2928-
assert!(is_hexagon_register_span("p1:0"));
2929-
assert!(is_hexagon_register_span("p3:2"));
2930-
assert!(is_hexagon_register_span("r99:98"));
2931-
assert!(is_hexagon_register_span("V123:122.whatever"));
2932-
2933-
// Invalid patterns - these should be treated as potential labels
2934-
assert!(!is_hexagon_register_span("label1"));
2935-
assert!(!is_hexagon_register_span("foo:"));
2936-
assert!(!is_hexagon_register_span(":0"));
2937-
assert!(!is_hexagon_register_span("r:0")); // missing digits before colon
2938-
assert!(!is_hexagon_register_span("r1:")); // missing digits after colon
2939-
assert!(!is_hexagon_register_span("r1:a")); // non-digit after colon
2940-
assert!(!is_hexagon_register_span("1:0")); // starts with digit, not letter
2941-
assert!(!is_hexagon_register_span("r1")); // no colon
2942-
assert!(!is_hexagon_register_span("r")); // too short
2943-
assert!(!is_hexagon_register_span("")); // empty
2944-
assert!(!is_hexagon_register_span("ra:0")); // letter in first digit group
2945-
}
2946-
}
2947-
29482942
impl<'tcx> LateLintPass<'tcx> for AsmLabels {
29492943
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'tcx>) {
29502944
if let hir::Expr {
@@ -3030,7 +3024,7 @@ impl<'tcx> LateLintPass<'tcx> for AsmLabels {
30303024
// Check for Hexagon register span notation (e.g., "r1:0", "V5:4", "V3:2.w")
30313025
// This is valid Hexagon assembly syntax, not a label
30323026
if matches!(cx.tcx.sess.asm_arch, Some(InlineAsmArch::Hexagon))
3033-
&& is_hexagon_register_span(possible_label)
3027+
&& is_hexagon_register_span_context(possible_label, statement, idx)
30343028
{
30353029
break 'label_loop;
30363030
}

compiler/rustc_lint/src/tests.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use rustc_span::{Symbol, create_default_session_globals_then};
44

5+
use crate::builtin::is_hexagon_register_span;
56
use crate::levels::parse_lint_and_tool_name;
67

78
#[test]
@@ -27,3 +28,29 @@ fn parse_lint_multiple_path() {
2728
)
2829
});
2930
}
31+
32+
#[test]
33+
fn test_hexagon_register_span_patterns() {
34+
// Valid Hexagon register span patterns
35+
assert!(is_hexagon_register_span("r1:0"));
36+
assert!(is_hexagon_register_span("r15:14"));
37+
assert!(is_hexagon_register_span("V5:4"));
38+
assert!(is_hexagon_register_span("V3:2"));
39+
assert!(is_hexagon_register_span("V5:4.w"));
40+
assert!(is_hexagon_register_span("V3:2.h"));
41+
assert!(is_hexagon_register_span("r99:98"));
42+
assert!(is_hexagon_register_span("V123:122.whatever"));
43+
44+
// Invalid patterns - these should be treated as potential labels
45+
assert!(!is_hexagon_register_span("label1"));
46+
assert!(!is_hexagon_register_span("foo:"));
47+
assert!(!is_hexagon_register_span(":0"));
48+
assert!(!is_hexagon_register_span("r:0")); // missing digits before colon
49+
assert!(!is_hexagon_register_span("r1:")); // missing digits after colon
50+
assert!(!is_hexagon_register_span("r1:a")); // non-digit after colon
51+
assert!(!is_hexagon_register_span("1:0")); // starts with digit, not letter
52+
assert!(!is_hexagon_register_span("r1")); // no colon
53+
assert!(!is_hexagon_register_span("r")); // too short
54+
assert!(!is_hexagon_register_span("")); // empty
55+
assert!(!is_hexagon_register_span("ra:0")); // letter in first digit group
56+
}

tests/ui/asm/hexagon-register-pairs.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@ fn test_register_spans() {
2020
asm!("r15:14 = memd(r30+#8)", lateout("r14") _, lateout("r15") _);
2121
asm!("memd(r29+#0) = r5:4", in("r4") 0u32, in("r5") 0u32);
2222

23-
// Vector register pairs
24-
asm!("V5:4 = vadd(V3:2, V1:0)", out("v4") _, out("v5") _);
25-
asm!("V7:6.w = vadd(V5:4.w, V3:2.w)", in("v4") _, in("v5") _, out("v6") _, out("v7") _);
26-
27-
// Predicate register pairs
28-
asm!("p1:0 = vcmpb.eq(V1:0, V3:2)", in("v1") _, in("v2") _, in("v3") _, in("v4") _, out("p0") _, out("p1") _);
23+
// These patterns look like register spans but test different edge cases
24+
// All should NOT trigger the lint as they match valid hexagon register syntax patterns
25+
asm!("V5:4 = vaddw(v1:0, v1:0)", options(nostack)); // Uppercase V register pair
26+
asm!("v1:0.w = vsub(v1:0.w,v1:0.w):sat", options(nostack)); // Lowercase v with suffix
2927

3028
// Mixed with actual labels should still trigger for the labels
3129
asm!("label1: r7:6 = combine(#2, #3)"); //~ ERROR avoid using named labels

0 commit comments

Comments
 (0)