1*14e96b49SReid Kleckner // REQUIRES: x86-registered-target
2*14e96b49SReid Kleckner // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -verify
3*14e96b49SReid Kleckner 
4*14e96b49SReid Kleckner struct A {
5*14e96b49SReid Kleckner   int a1;
6*14e96b49SReid Kleckner   int a2;
7*14e96b49SReid Kleckner   struct B {
8*14e96b49SReid Kleckner     int b1;
9*14e96b49SReid Kleckner     int b2;
10*14e96b49SReid Kleckner     enum { kValue = 42 };
11*14e96b49SReid Kleckner   } a3;
12*14e96b49SReid Kleckner   struct {
13*14e96b49SReid Kleckner     int indirect_field;
14*14e96b49SReid Kleckner   };
15*14e96b49SReid Kleckner };
16*14e96b49SReid Kleckner 
17*14e96b49SReid Kleckner namespace asdf {
18*14e96b49SReid Kleckner A a_global;
19*14e96b49SReid Kleckner }
20*14e96b49SReid Kleckner 
21*14e96b49SReid Kleckner // The parser combines adjacent __asm blocks into one. Avoid that by calling
22*14e96b49SReid Kleckner // this.
23*14e96b49SReid Kleckner void split_inline_asm_call();
24*14e96b49SReid Kleckner 
test_field_lookup()25*14e96b49SReid Kleckner void test_field_lookup() {
26*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global.a3.b2
27*14e96b49SReid Kleckner   split_inline_asm_call();
28*14e96b49SReid Kleckner 
29*14e96b49SReid Kleckner   // FIXME: These diagnostics are crap.
30*14e96b49SReid Kleckner 
31*14e96b49SReid Kleckner   // expected-error@+1 {{undeclared label}}
32*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global.not_a_field.b2
33*14e96b49SReid Kleckner   split_inline_asm_call();
34*14e96b49SReid Kleckner 
35*14e96b49SReid Kleckner   // expected-error@+1 {{undeclared label}}
36*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global.a3.not_a_field
37*14e96b49SReid Kleckner   split_inline_asm_call();
38*14e96b49SReid Kleckner 
39*14e96b49SReid Kleckner   __asm mov eax, A::B::kValue
40*14e96b49SReid Kleckner   split_inline_asm_call();
41*14e96b49SReid Kleckner 
42*14e96b49SReid Kleckner   // expected-error@+1 {{undeclared label}}
43*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global.a3.kValue
44*14e96b49SReid Kleckner   split_inline_asm_call();
45*14e96b49SReid Kleckner 
46*14e96b49SReid Kleckner   __asm mov eax, asdf :: a_global.a3.b2
47*14e96b49SReid Kleckner   split_inline_asm_call();
48*14e96b49SReid Kleckner 
49*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global . a3 . b2
50*14e96b49SReid Kleckner   split_inline_asm_call();
51*14e96b49SReid Kleckner 
52*14e96b49SReid Kleckner   __asm mov eax, asdf::a_global.indirect_field
53*14e96b49SReid Kleckner   split_inline_asm_call();
54*14e96b49SReid Kleckner }
55