-// RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s\r
-\r
-// CHECK: %struct.nested1 = type { i32, i32 }\r
-typedef struct nested1 {\r
- int a1;\r
- int b1;\r
-} NESTED1;\r
-\r
-// CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }\r
-struct nested2 {\r
- int a;\r
- NESTED1; \r
- int b;\r
-};\r
-\r
-// CHECK: %struct.test = type { i32, %struct.nested2, i32 }\r
-struct test {\r
- int x;\r
- struct nested2; \r
- int y;\r
-};\r
-\r
-\r
-void foo()\r
-{\r
- // CHECK: %var = alloca %struct.test, align 4\r
- struct test var;\r
-\r
- // CHECK: getelementptr inbounds %struct.test* %var, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.a;\r
-\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.b;\r
-\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.a1;\r
-\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}var, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.b1;\r
-\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.x;\r
-\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 2\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var.y;\r
-}\r
-\r
-void foo2(struct test* var)\r
-{\r
- // CHECK: alloca %struct.test*, align\r
- // CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->a;\r
-\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->b;\r
-\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->a1;\r
-\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->b1;\r
-\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 0\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->x;\r
-\r
- // CHECK-NEXT: load %struct.test** %{{.*}}, align\r
- // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 2\r
- // CHECK-NEXT: load i32* %{{.*}}, align 4\r
- var->y;\r
-}\r
+// RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s
+
+// CHECK: %struct.nested1 = type { i32, i32 }
+typedef struct nested1 {
+ int a1;
+ int b1;
+} NESTED1;
+
+// CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }
+struct nested2 {
+ int a;
+ NESTED1;
+ int 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
+ // CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align
+ // CHECK-NEXT: load %struct.test** %{{.*}}, align
+ // 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
+ // 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
+ // 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
+ // 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
+ // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 0
+ // CHECK-NEXT: load i32* %{{.*}}, align 4
+ var->x;
+
+ // CHECK-NEXT: load %struct.test** %{{.*}}, align
+ // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 2
+ // CHECK-NEXT: load i32* %{{.*}}, align 4
+ var->y;
+}