1 // REQUIRES: x86-registered-target 2 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fasm-blocks -Wno-microsoft -verify -fsyntax-only 3 4 void t1(void) { 5 __asm __asm // expected-error {{__asm used with no assembly instructions}} 6 } 7 8 void 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 36 void 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 52 static int global; 53 54 int 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 77 typedef struct { 78 int a; 79 int b; 80 } A; 81 82 void 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 91 void 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