blob: e1d79c116c80c2c638ac0053af94dfeee01791b6 [file] [log] [blame]
NAKAMURA Takumi0acd8a72013-12-04 03:41:33 +00001// REQUIRES: x86-registered-target
Chad Rosiere3aac2c2013-01-22 19:38:32 +00002// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fasm-blocks -Wno-microsoft -verify -fsyntax-only
Bob Wilson317be452012-09-24 19:57:59 +00003
4void t1(void) {
Eli Friedmand5d136b2012-10-23 02:43:30 +00005 __asm __asm // expected-error {{__asm used with no assembly instructions}}
6}
7
8void f() {
Chad Rosier0130f822012-10-26 18:33:59 +00009 int foo;
Eli Friedmand5d136b2012-10-23 02:43:30 +000010 __asm {
11 mov eax, eax
12 .unknowndirective // expected-error {{unknown directive}}
13 }
14 f();
15 __asm {
Benjamin Kramer6b724722013-12-01 11:48:10 +000016 mov eax, 1+=2 // expected-error {{unknown token in expression}}
Eli Friedmand5d136b2012-10-23 02:43:30 +000017 }
18 f();
19 __asm {
Benjamin Kramer6b724722013-12-01 11:48:10 +000020 mov eax, 1+++ // expected-error {{unknown token in expression}}
Eli Friedmand5d136b2012-10-23 02:43:30 +000021 }
Chad Rosier92c487d2013-01-18 00:51:29 +000022 f();
23 __asm {
Benjamin Kramer6b724722013-12-01 11:48:10 +000024 mov eax, LENGTH bar // expected-error {{unable to lookup expression}}
Chad Rosier92c487d2013-01-18 00:51:29 +000025 }
26 f();
27 __asm {
Benjamin Kramer6b724722013-12-01 11:48:10 +000028 mov eax, SIZE bar // expected-error {{unable to lookup expression}}
Chad Rosier92c487d2013-01-18 00:51:29 +000029 }
30 f();
31 __asm {
Benjamin Kramer6b724722013-12-01 11:48:10 +000032 mov eax, TYPE bar // expected-error {{unable to lookup expression}}
Chad Rosier92c487d2013-01-18 00:51:29 +000033 }
Bob Wilson317be452012-09-24 19:57:59 +000034}
Dmitri Gribenkofc13b8b2013-12-03 00:48:09 +000035
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
Dmitri Gribenkofc13b8b2013-12-03 00:48:09 +000041 __asm {
42 and ecx, ~15
43 }
44
45 int x = 0;
Dmitri Gribenkofc13b8b2013-12-03 00:48:09 +000046 __asm {
47 and ecx, x
48 and ecx, ~15
49 }
50}
Reid Kleckner51082b12014-03-04 17:57:56 +000051
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}}
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000063 __asm { mov eax, arr[ebp + 1 + (2 * 5) - 3 + 1<<1] }
Reid Kleckner51082b12014-03-04 17:57:56 +000064 // expected-error@+1 {{cannot use index register with variable reference}}
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000065 __asm { mov eax, arr[esi * 4] }
Reid Kleckner51082b12014-03-04 17:57:56 +000066 // expected-error@+1 {{cannot use more than one symbol in memory operand}}
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000067 __asm { mov eax, arr[i] }
Reid Kleckner51082b12014-03-04 17:57:56 +000068 // expected-error@+1 {{cannot use more than one symbol in memory operand}}
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000069 __asm { mov eax, global[i] }
Reid Kleckner51082b12014-03-04 17:57:56 +000070
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 Kleckner8d4a16e2014-03-06 19:19:36 +000076
77typedef struct {
78 int a;
79 int b;
80} A;
81
82void t3() {
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000083 __asm { mov eax, [eax] UndeclaredId } // expected-error {{unknown token in expression}}
Reid Kleckner8d4a16e2014-03-06 19:19:36 +000084
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 Akhgari2f93b442014-07-25 02:27:14 +000088 __asm { mov eax, [eax] A }
Reid Kleckner8d4a16e2014-03-06 19:19:36 +000089}
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.
Ehsan Akhgari2f93b442014-07-25 02:27:14 +000094 __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 Kleckner8d4a16e2014-03-06 19:19:36 +0000101}