187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// REQUIRES: x86-registered-target
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -verify
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct A {
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int a1;
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int a2;
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct B {
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int b1;
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int b2;
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    enum { kValue = 42 };
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  } a3;
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct {
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int indirect_field;
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace asdf {
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarA a_global;
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// The parser combines adjacent __asm blocks into one. Avoid that by calling
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// this.
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid split_inline_asm_call();
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid test_field_lookup() {
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global.a3.b2
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // FIXME: These diagnostics are crap.
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // expected-error@+1 {{undeclared label}}
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global.not_a_field.b2
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // expected-error@+1 {{undeclared label}}
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global.a3.not_a_field
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, A::B::kValue
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // expected-error@+1 {{undeclared label}}
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global.a3.kValue
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf :: a_global.a3.b2
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global . a3 . b2
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __asm mov eax, asdf::a_global.indirect_field
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  split_inline_asm_call();
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
55