Microsoft C anonymous struct implementation.
Documentation: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120000 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGen/ms-anonymous-struct.c b/test/CodeGen/ms-anonymous-struct.c
new file mode 100644
index 0000000..280a40c
--- /dev/null
+++ b/test/CodeGen/ms-anonymous-struct.c
@@ -0,0 +1,99 @@
+// RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s

+

+// CHECK: %struct.nested1 = type { i32, i32 }

+typedef struct nested1 {

+    long a1;

+    long b1;

+} NESTED1;

+

+// CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }

+struct nested2 {

+    long a;

+    NESTED1; 

+    long b;

+};

+

+// CHECK: %struct.test = type { i32, %struct.nested2, i32 }

+struct test {

+    int    x;

+    struct nested2; 

+    int    y;

+};

+

+

+void foo()

+{

+  // CHECK: %var = alloca %struct.test, align 4

+  struct test var;

+

+  // CHECK: getelementptr inbounds %struct.test* %var, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.a;

+

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.b;

+

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.a1;

+

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}var, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.b1;

+

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.x;

+

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 2

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var.y;

+}

+

+void foo2(struct test* var)

+{

+  // CHECK: alloca %struct.test*, align 4

+  // CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->a;

+

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->b;

+

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->a1;

+

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->b1;

+

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 0

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->x;

+

+  // CHECK-NEXT: load %struct.test** %{{.*}}, align 4

+  // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 2

+  // CHECK-NEXT: load i32* %{{.*}}, align 4

+  var->y;

+}