ms-inline-asm.c revision ef8225444452a1486bd721f3285301fe84643b00
1// REQUIRES: x86-registered-target 2// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fasm-blocks -Wno-microsoft -verify -fsyntax-only 3 4void t1(void) { 5 __asm __asm // expected-error {{__asm used with no assembly instructions}} 6} 7 8void f() { 9 int foo; 10 __asm { 11 mov eax, eax 12 .unknowndirective // expected-error {{unknown directive}} 13 } 14 f(); 15 __asm { 16 mov eax, 1+=2 // expected-error {{unknown token in expression}} 17 } 18 f(); 19 __asm { 20 mov eax, 1+++ // expected-error {{unknown token in expression}} 21 } 22 f(); 23 __asm { 24 mov eax, LENGTH bar // expected-error {{unable to lookup expression}} 25 } 26 f(); 27 __asm { 28 mov eax, SIZE bar // expected-error {{unable to lookup expression}} 29 } 30 f(); 31 __asm { 32 mov eax, TYPE bar // expected-error {{unable to lookup expression}} 33 } 34} 35 36void rdar15318432(void) { 37 // We used to crash on this. When LLVM called back to Clang to parse a name 38 // and do name lookup, if parsing failed, we did not restore the lexer state 39 // properly. 40 41 __asm { 42 and ecx, ~15 43 } 44 45 int x = 0; 46 __asm { 47 and ecx, x 48 and ecx, ~15 49 } 50} 51 52static int global; 53 54int t2(int *arr, int i) { 55 __asm { 56 mov eax, arr; 57 mov eax, arr[0]; 58 mov eax, arr[1 + 2]; 59 mov eax, arr[1 + (2 * 5) - 3 + 1<<1]; 60 } 61 62 // expected-error@+1 {{cannot use base register with variable reference}} 63 __asm mov eax, arr[ebp + 1 + (2 * 5) - 3 + 1<<1] 64 // expected-error@+1 {{cannot use index register with variable reference}} 65 __asm mov eax, arr[esi * 4] 66 // expected-error@+1 {{cannot use more than one symbol in memory operand}} 67 __asm mov eax, arr[i] 68 // expected-error@+1 {{cannot use more than one symbol in memory operand}} 69 __asm mov eax, global[i] 70 71 // FIXME: Why don't we diagnose this? 72 // expected-Xerror@+1 {{cannot reference multiple local variables in assembly operand}} 73 //__asm mov eax, [arr + i]; 74 return 0; 75} 76 77typedef struct { 78 int a; 79 int b; 80} A; 81 82void t3() { 83 __asm mov eax, [eax] UndeclaredId // expected-error {{unknown token in expression}} 84 85 // FIXME: Only emit one diagnostic here. 86 // expected-error@+2 {{unexpected type name 'A': expected expression}} 87 // expected-error@+1 {{unknown token in expression}} 88 __asm mov eax, [eax] A 89} 90 91void t4() { 92 // The dot in the "intel dot operator" is optional in MSVC. MSVC also does 93 // global field lookup, but we don't. 94 __asm mov eax, [0] A.a 95 __asm mov eax, [0].A.a 96 __asm mov eax, [0].a // expected-error {{Unable to lookup field reference!}} 97 __asm mov eax, fs:[0] A.a 98 __asm mov eax, fs:[0].A.a 99 __asm mov eax, fs:[0].a // expected-error {{Unable to lookup field reference!}} 100 __asm mov eax, fs:[0]. A.a // expected-error {{Unexpected token type!}} 101} 102