// Check that the 3.1 named operand syntax can be used in template functions. struct arg1 { int value; static const int info = 99; }; struct arg2 { int value; static const int info = 11; }; template int foo (void) { int i; asm ("# foo on %[third] %[second] %[fourth] %[first]" : [first] "=r" (i) : [second] "i" (j), [third] "i" (j + 2), [fourth] "i" (100)); return i; } template TYPE bar (TYPE t) { asm ("# bar on %[first] %[second] %[third]" : [first] "=r" (t.value) : [second] "i[first]" (t.value), [third] "i" (t.info)); return t; } template struct S { static void frob (TYPE t) { asm ("# frob on %[arg]" :: [arg] "i" (t.info)); } }; void test () { arg1 x; arg2 y; foo<42> (); bar (x); bar (y); S::frob (x); } // { dg-final { scan-assembler "foo on" } } // { dg-final { scan-assembler "bar on" } } // { dg-final { scan-assembler "frob on" } }