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 | |
Dmitri Gribenko | fc13b8b | 2013-12-03 00:48:09 +0000 | [diff] [blame] | 41 | __asm { |
| 42 | and ecx, ~15 |
| 43 | } |
| 44 | |
| 45 | int x = 0; |
Dmitri Gribenko | fc13b8b | 2013-12-03 00:48:09 +0000 | [diff] [blame] | 46 | __asm { |
| 47 | and ecx, x |
| 48 | and ecx, ~15 |
| 49 | } |
| 50 | } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 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}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 63 | __asm { mov eax, arr[ebp + 1 + (2 * 5) - 3 + 1<<1] } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 64 | // expected-error@+1 {{cannot use index register with variable reference}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 65 | __asm { mov eax, arr[esi * 4] } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 66 | // expected-error@+1 {{cannot use more than one symbol in memory operand}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 67 | __asm { mov eax, arr[i] } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 68 | // expected-error@+1 {{cannot use more than one symbol in memory operand}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 69 | __asm { mov eax, global[i] } |
Reid Kleckner | 51082b1 | 2014-03-04 17:57:56 +0000 | [diff] [blame] | 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 | } |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 76 | |
| 77 | typedef struct { |
| 78 | int a; |
| 79 | int b; |
| 80 | } A; |
| 81 | |
| 82 | void t3() { |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 83 | __asm { mov eax, [eax] UndeclaredId } // expected-error {{unknown token in expression}} |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 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}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 88 | __asm { mov eax, [eax] A } |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 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. |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame^] | 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!}} |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 101 | } |