Hi! Last year I've extended the asm template syntax in inline asm to support %cc0 etc., apparently the first 2 letter generic operand modifier. As the following testcase shows, I forgot to tweak the [foo] handling for it though. As final.cc will error on any % ISALPHA not followed by digit (with the exception of % c c digit), I think we can safely handle this for any 2 letters in between % and [, instead of hardcoding it for now only for %cc[ and changing it again next time we add something two-letter.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk and 15.3? 2025-10-04 Jakub Jelinek <[email protected]> PR middle-end/122133 * stmt.cc (resolve_asm_operand_names): Handle % and 2 letters followed by open square. * c-c++-common/toplevel-asm-9.c: New test. --- gcc/stmt.cc.jj 2025-07-27 23:31:10.723994037 +0200 +++ gcc/stmt.cc 2025-10-03 10:29:44.413830622 +0200 @@ -849,7 +849,8 @@ resolve_asm_operand_names (tree string, { if (c[1] == '[') break; - else if (ISALPHA (c[1]) && c[2] == '[') + else if (ISALPHA (c[1]) + && (c[2] == '[' || (ISALPHA (c[2]) && c[3] == '['))) break; else { @@ -873,6 +874,8 @@ resolve_asm_operand_names (tree string, p += 1; else if (ISALPHA (p[1]) && p[2] == '[') p += 2; + else if (ISALPHA (p[1]) && ISALPHA (p[2]) && p[3] == '[') + p += 3; else { p += 1 + (p[1] == '%'); --- gcc/testsuite/c-c++-common/toplevel-asm-9.c.jj 2025-10-03 10:23:04.971437475 +0200 +++ gcc/testsuite/c-c++-common/toplevel-asm-9.c 2025-10-03 10:33:36.141577934 +0200 @@ -0,0 +1,12 @@ +/* PR middle-end/122133 */ +/* { dg-do compile } */ +/* { dg-options "-O0" } */ + +extern int v[42], w; +int x[42], y; +void foo (void); +void bar (void) {} + +asm ("# %cc[foo]: %cc[v]: %cc[w]: %cc[bar] %cc[x] %cc[y]" + :: [foo] ":" (foo), [v] ":" (v), [w] ":" (&w), + [bar] "-i" (bar), [x] "-s" (x), [y] "-s" (&y)); Jakub
