asm.c revision eab8cfbf4b2e85b66cea6e0fea3b7f8fd2685722
1// RUN: clang %s -arch=i386 -verify -fsyntax-only 2 3void f() { 4 int i; 5 6 asm ("foo\n" : : "a" (i + 2)); 7 asm ("foo\n" : : "a" (f())); // expected-error {{invalid type 'void' in asm input}} 8 9 asm ("foo\n" : "=a" (f())); // expected-error {{invalid lvalue in asm output}} 10 asm ("foo\n" : "=a" (i + 2)); // expected-error {{invalid lvalue in asm output}} 11 12 asm ("foo\n" : [symbolic_name] "=a" (i) : "[symbolic_name]" (i)); 13 asm ("foo\n" : "=a" (i) : "[" (i)); // expected-error {{invalid input constraint '[' in asm}} 14 asm ("foo\n" : "=a" (i) : "[foo" (i)); // expected-error {{invalid input constraint '[foo' in asm}} 15 asm ("foo\n" : "=a" (i) : "[symbolic_name]" (i)); // expected-error {{invalid input constraint '[symbolic_name]' in asm}} 16} 17 18void clobbers() { 19 asm ("nop" : : : "ax", "#ax", "%ax"); 20 asm ("nop" : : : "eax", "rax", "ah", "al"); 21 asm ("nop" : : : "0", "%0", "#0"); 22 asm ("nop" : : : "foo"); // expected-error {{unknown register name 'foo' in asm}} 23 asm ("nop" : : : "52"); 24 asm ("nop" : : : "53"); // expected-error {{unknown register name '53' in asm}} 25 asm ("nop" : : : "-1"); // expected-error {{unknown register name '-1' in asm}} 26 asm ("nop" : : : "+1"); // expected-error {{unknown register name '+1' in asm}} 27} 28 29// rdar://6094010 30void test3() { 31 int x; 32 asm(L"foo" : "=r"(x)); // expected-error {{wide string}} 33 asm("foo" : L"=r"(x)); // expected-error {{wide string}} 34} 35 36// <rdar://problem/6156893> 37void test4(const volatile void *addr) 38{ 39 asm ("nop" : : "r"(*addr)); // expected-error {{invalid type 'void const volatile' in asm input for constraint 'r'}} 40 asm ("nop" : : "m"(*addr)); 41 42 asm ("nop" : : "r"(test4(addr))); // expected-error {{invalid type 'void' in asm input for constraint 'r'}} 43 asm ("nop" : : "m"(test4(addr))); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 44 45 asm ("nop" : : "m"(f())); // expected-error {{invalid lvalue in asm input for constraint 'm'}} 46} 47 48// <rdar://problem/6512595> 49void test5() { 50 asm("nop" : : "X" (8)); 51} 52 53// PR3385 54void test6(long i) { 55 asm("nop" : : "er"(i)); 56} 57 58void asm_string_tests() { 59 asm("%!"); // simple asm string, %! is not an error. 60 asm("%!" : ); // expected-error {{invalid % escape in inline assembly string}} 61 asm("xyz %" : ); // expected-error {{invalid % escape in inline assembly string}} 62 63 asm ("%[somename]" :: [somename] "i"(4)); // ok 64 asm ("%[somename]" :: "i"(4)); // expected-error {{unknown symbolic operand name in inline assembly string}} 65 asm ("%[somename" :: "i"(4)); // expected-error {{unterminated symbolic operand name in inline assembly string}} 66 asm ("%[]" :: "i"(4)); // expected-error {{empty symbolic operand name in inline assembly string}} 67} 68