NAKAMURA Takumi | 0acd8a7 | 2013-12-04 03:41:33 +0000 | [diff] [blame] | 1 | // REQUIRES: x86-registered-target |
Chad Rosier | e3aac2c | 2013-01-22 19:38:32 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fasm-blocks -Wno-microsoft -verify -fsyntax-only |
Bob Wilson | 317be45 | 2012-09-24 19:57:59 +0000 | [diff] [blame] | 3 | |
| 4 | void t1(void) { |
Eli Friedman | d5d136b | 2012-10-23 02:43:30 +0000 | [diff] [blame] | 5 | __asm __asm // expected-error {{__asm used with no assembly instructions}} |
| 6 | } |
| 7 | |
| 8 | void f() { |
Chad Rosier | 0130f82 | 2012-10-26 18:33:59 +0000 | [diff] [blame] | 9 | int foo; |
Eli Friedman | d5d136b | 2012-10-23 02:43:30 +0000 | [diff] [blame] | 10 | __asm { |
| 11 | mov eax, eax |
| 12 | .unknowndirective // expected-error {{unknown directive}} |
| 13 | } |
| 14 | f(); |
| 15 | __asm { |
Benjamin Kramer | 6b72472 | 2013-12-01 11:48:10 +0000 | [diff] [blame] | 16 | mov eax, 1+=2 // expected-error {{unknown token in expression}} |
Eli Friedman | d5d136b | 2012-10-23 02:43:30 +0000 | [diff] [blame] | 17 | } |
| 18 | f(); |
| 19 | __asm { |
Benjamin Kramer | 6b72472 | 2013-12-01 11:48:10 +0000 | [diff] [blame] | 20 | mov eax, 1+++ // expected-error {{unknown token in expression}} |
Eli Friedman | d5d136b | 2012-10-23 02:43:30 +0000 | [diff] [blame] | 21 | } |
Chad Rosier | 92c487d | 2013-01-18 00:51:29 +0000 | [diff] [blame] | 22 | f(); |
| 23 | __asm { |
Benjamin Kramer | 6b72472 | 2013-12-01 11:48:10 +0000 | [diff] [blame] | 24 | mov eax, LENGTH bar // expected-error {{unable to lookup expression}} |
Chad Rosier | 92c487d | 2013-01-18 00:51:29 +0000 | [diff] [blame] | 25 | } |
| 26 | f(); |
| 27 | __asm { |
Benjamin Kramer | 6b72472 | 2013-12-01 11:48:10 +0000 | [diff] [blame] | 28 | mov eax, SIZE bar // expected-error {{unable to lookup expression}} |
Chad Rosier | 92c487d | 2013-01-18 00:51:29 +0000 | [diff] [blame] | 29 | } |
| 30 | f(); |
| 31 | __asm { |
Benjamin Kramer | 6b72472 | 2013-12-01 11:48:10 +0000 | [diff] [blame] | 32 | mov eax, TYPE bar // expected-error {{unable to lookup expression}} |
Chad Rosier | 92c487d | 2013-01-18 00:51:29 +0000 | [diff] [blame] | 33 | } |
Bob Wilson | 317be45 | 2012-09-24 19:57:59 +0000 | [diff] [blame] | 34 | } |
Dmitri Gribenko | fc13b8b | 2013-12-03 00:48:09 +0000 | [diff] [blame] | 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 | // expected-error@+2 {{expected identifier}} |
| 42 | __asm { |
| 43 | and ecx, ~15 |
| 44 | } |
| 45 | |
| 46 | int x = 0; |
| 47 | // expected-error@+3 {{expected identifier}} |
| 48 | __asm { |
| 49 | and ecx, x |
| 50 | and ecx, ~15 |
| 51 | } |
| 52 | } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 53 | |
| 54 | static int global; |
| 55 | |
| 56 | int t2(int *arr, int i) { |
| 57 | __asm { |
| 58 | mov eax, arr; |
| 59 | mov eax, arr[0]; |
| 60 | mov eax, arr[1 + 2]; |
| 61 | mov eax, arr[1 + (2 * 5) - 3 + 1<<1]; |
| 62 | } |
| 63 | |
| 64 | // expected-error@+1 {{cannot use base register with variable reference}} |
| 65 | __asm mov eax, arr[ebp + 1 + (2 * 5) - 3 + 1<<1] |
| 66 | // expected-error@+1 {{cannot use index register with variable reference}} |
| 67 | __asm mov eax, arr[esi * 4] |
| 68 | // expected-error@+1 {{cannot use more than one symbol in memory operand}} |
| 69 | __asm mov eax, arr[i] |
| 70 | // expected-error@+1 {{cannot use more than one symbol in memory operand}} |
| 71 | __asm mov eax, global[i] |
| 72 | |
| 73 | // FIXME: Why don't we diagnose this? |
| 74 | // expected-Xerror@+1 {{cannot reference multiple local variables in assembly operand}} |
| 75 | //__asm mov eax, [arr + i]; |
| 76 | return 0; |
| 77 | } |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame^] | 78 | |
| 79 | typedef struct { |
| 80 | int a; |
| 81 | int b; |
| 82 | } A; |
| 83 | |
| 84 | void t3() { |
| 85 | __asm mov eax, [eax] UndeclaredId // expected-error {{unknown token in expression}} |
| 86 | |
| 87 | // FIXME: Only emit one diagnostic here. |
| 88 | // expected-error@+2 {{unexpected type name 'A': expected expression}} |
| 89 | // expected-error@+1 {{unknown token in expression}} |
| 90 | __asm mov eax, [eax] A |
| 91 | } |
| 92 | |
| 93 | void t4() { |
| 94 | // The dot in the "intel dot operator" is optional in MSVC. MSVC also does |
| 95 | // global field lookup, but we don't. |
| 96 | __asm mov eax, [0] A.a |
| 97 | __asm mov eax, [0].A.a |
| 98 | __asm mov eax, [0].a // expected-error {{Unable to lookup field reference!}} |
| 99 | __asm mov eax, fs:[0] A.a |
| 100 | __asm mov eax, fs:[0].A.a |
| 101 | __asm mov eax, fs:[0].a // expected-error {{Unable to lookup field reference!}} |
| 102 | __asm mov eax, fs:[0]. A.a // expected-error {{Unexpected token type!}} |
| 103 | } |