asm.c revision f69fcaeb3843297757251a19f0a6f5bbffed7f32
1// RUN: clang-cc %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(int i) { 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 // PR3258 69 asm("%9" :: "i"(4)); // expected-error {{invalid operand number in inline asm string}} 70 asm("%1" : "+r"(i)); // ok, referring to input. 71} 72 73// PR4077 74int test7(unsigned long long b) { 75 int a; 76 asm volatile("foo %0 %1" : "=a" (a) :"0" (b)); // expected-error {{input with type 'unsigned long long' matching output with type 'int'}} 77 return a; 78} 79