NAKAMURA Takumi | 0acd8a7 | 2013-12-04 03:41:33 +0000 | [diff] [blame] | 1 | // REQUIRES: x86-registered-target |
Aaron Ballman | 674cf26 | 2015-05-26 19:44:52 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fms-extensions -fasm-blocks -Wno-microsoft -Wunused-label -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 { |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 32 | mov eax, TYPE bar // expected-error {{unable to lookup expression}} expected-error {{use of undeclared label 'bar'}} |
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 | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 83 | __asm { mov eax, [eax] UndeclaredId } // expected-error {{unknown token in expression}} expected-error {{use of undeclared label 'UndeclaredId'}} |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 84 | |
| 85 | // FIXME: Only emit one diagnostic here. |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 86 | // expected-error@+3 {{use of undeclared label 'A'}} |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 87 | // expected-error@+2 {{unexpected type name 'A': expected expression}} |
| 88 | // expected-error@+1 {{unknown token in expression}} |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame] | 89 | __asm { mov eax, [eax] A } |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | void t4() { |
| 93 | // The dot in the "intel dot operator" is optional in MSVC. MSVC also does |
| 94 | // global field lookup, but we don't. |
Ehsan Akhgari | 2f93b44 | 2014-07-25 02:27:14 +0000 | [diff] [blame] | 95 | __asm { mov eax, [0] A.a } |
| 96 | __asm { mov eax, [0].A.a } |
| 97 | __asm { mov eax, [0].a } // expected-error {{Unable to lookup field reference!}} |
| 98 | __asm { mov eax, fs:[0] A.a } |
| 99 | __asm { mov eax, fs:[0].A.a } |
| 100 | __asm { mov eax, fs:[0].a } // expected-error {{Unable to lookup field reference!}} |
| 101 | __asm { mov eax, fs:[0]. A.a } // expected-error {{Unexpected token type!}} |
Reid Kleckner | 8d4a16e | 2014-03-06 19:19:36 +0000 | [diff] [blame] | 102 | } |
Reid Kleckner | 05d2daf | 2014-08-01 20:23:03 +0000 | [diff] [blame] | 103 | |
| 104 | void test_operand_size() { |
| 105 | __asm { call word t4 } // expected-error {{Expected 'PTR' or 'ptr' token!}} |
| 106 | } |
Hans Wennborg | 93dbeae | 2014-09-04 22:16:48 +0000 | [diff] [blame] | 107 | |
| 108 | __declspec(naked) int t5(int x) { // expected-note {{attribute is here}} |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 109 | asm { movl eax, x } // expected-error {{parameter references not allowed in naked functions}} expected-error {{use of undeclared label 'x'}} |
Hans Wennborg | 93dbeae | 2014-09-04 22:16:48 +0000 | [diff] [blame] | 110 | asm { retl } |
| 111 | } |
| 112 | |
| 113 | int y; |
| 114 | __declspec(naked) int t6(int x) { |
| 115 | asm { mov eax, y } // No error. |
| 116 | asm { ret } |
| 117 | } |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 118 | |
| 119 | void t7() { |
| 120 | __asm { |
| 121 | foo: // expected-note {{inline assembly label 'foo' declared here}} |
| 122 | mov eax, 0 |
| 123 | } |
| 124 | goto foo; // expected-error {{cannot jump from this goto statement to label 'foo' inside an inline assembly block}} |
| 125 | } |
| 126 | |
| 127 | void t8() { |
| 128 | __asm foo: // expected-note {{inline assembly label 'foo' declared here}} |
| 129 | __asm mov eax, 0 |
| 130 | goto foo; // expected-error {{cannot jump from this goto statement to label 'foo' inside an inline assembly block}} |
| 131 | } |
| 132 | |
| 133 | void t9() { |
| 134 | goto foo; // expected-error {{cannot jump from this goto statement to label 'foo' inside an inline assembly block}} |
| 135 | __asm { |
| 136 | foo: // expected-note {{inline assembly label 'foo' declared here}} |
| 137 | mov eax, 0 |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | void t10() { |
| 142 | goto foo; // expected-error {{cannot jump from this goto statement to label 'foo' inside an inline assembly block}} |
| 143 | __asm foo: // expected-note {{inline assembly label 'foo' declared here}} |
| 144 | __asm mov eax, 0 |
| 145 | } |
| 146 | |
| 147 | void t11() { |
| 148 | foo: |
Ehsan Akhgari | 4292443 | 2014-10-08 17:28:34 +0000 | [diff] [blame] | 149 | __asm mov eax, foo // expected-error {{use of undeclared label 'foo'}} expected-warning {{unused label 'foo'}} |
| 150 | } |
| 151 | |
| 152 | void t12() { |
| 153 | __asm foo: |
| 154 | __asm bar: // expected-warning {{unused label 'bar'}} |
| 155 | __asm jmp foo |
Ehsan Akhgari | 3109758 | 2014-09-22 02:21:54 +0000 | [diff] [blame] | 156 | } |