__alignof attribute on the field must consider
packed attribute on the field. //rdar://9217290


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130948 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 717c3a8..d6535e9 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -635,6 +635,10 @@
       UseAlignAttrOnly = true;
     }
   }
+  else if (isa<FieldDecl>(D))
+      UseAlignAttrOnly = 
+        D->hasAttr<PackedAttr>() ||
+        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
 
   // If we're using the align attribute only, just ignore everything
   // else about the declaration and its type.
diff --git a/test/CodeGen/packed-arrays.c b/test/CodeGen/packed-arrays.c
index 785db4d..0c8bb6c 100644
--- a/test/CodeGen/packed-arrays.c
+++ b/test/CodeGen/packed-arrays.c
@@ -34,10 +34,8 @@
 
 // CHECK: @align0_x = global i32 1
 int align0_x = __alignof(((struct s0*) 0)->x);
-// We are currently incompatible with GCC here. <rdar://problem/9217290>
 //
-// CHECK-XFAIL: @align1_x = global i32 1
-// CHECK: @align1_x = global i32 4
+// CHECK: @align1_x = global i32 1
 int align1_x = __alignof(((struct s1*) 0)->x);
 // CHECK: @align2_x = global i32 1
 int align2_x = __alignof(((struct s2*) 0)->x);
@@ -66,22 +64,22 @@
   return *(a->x + 1);
 }
 
+// Note that we are incompatible with GCC on this example.
+// 
 // CHECK: define i32 @f1_a
-// CHECK:   load i32* %{{.*}}, align 4
+// CHECK:   load i32* %{{.*}}, align 1
 // CHECK: }
 // CHECK: define i32 @f1_b
 // CHECK:   load i32* %{{.*}}, align 4
 // CHECK: }
 
-// Note that we are incompatible with GCC on these two examples.
+// Note that we are incompatible with GCC on this example.
 //
 // CHECK: define i32 @f1_c
-// CHECK-XFAIL:   load i32* %{{.*}}, align 1
 // CHECK:   load i32* %{{.*}}, align 4
 // CHECK: }
 // CHECK: define i32 @f1_d
-// CHECK-XFAIL:   load i32* %{{.*}}, align 1
-// CHECK:   load i32* %{{.*}}, align 4
+// CHECK:   load i32* %{{.*}}, align 1
 // CHECK: }
 int f1_a(struct s1 *a) {
   return a->x[1];
diff --git a/test/CodeGen/packed-structure.c b/test/CodeGen/packed-structure.c
index 731a50b..3aeaa23 100644
--- a/test/CodeGen/packed-structure.c
+++ b/test/CodeGen/packed-structure.c
@@ -10,8 +10,7 @@
 
 // CHECK-GLOBAL: @s0_align_x = global i32 4
 
-// FIXME: This should be 1 to match gcc. PR7951.
-// CHECK-GLOBAL: @s0_align_y = global i32 4
+// CHECK-GLOBAL: @s0_align_y = global i32 1
 
 // CHECK-GLOBAL: @s0_align = global i32 4
 int s0_align_x = __alignof(((struct s0*)0)->x);
@@ -27,7 +26,7 @@
 // with align 1 (in 2363.1 at least).
 //
 // CHECK-FUNCTIONS: define i32 @s0_load_y
-// CHECK-FUNCTIONS: [[s0_load_y:%.*]] = load i32* {{.*}}, align 4
+// CHECK-FUNCTIONS: [[s0_load_y:%.*]] = load i32* {{.*}}, align 1
 // CHECK-FUNCTIONS: ret i32 [[s0_load_y]]
 int s0_load_y(struct s0 *a) { return a->y; }
 // CHECK-FUNCTIONS: define void @s0_copy
@@ -92,11 +91,11 @@
   short aShort;
   int anInt;
 };
-// CHECK-GLOBAL: @s3_1 = global i32 2
+// CHECK-GLOBAL: @s3_1 = global i32 1
 int s3_1 = __alignof(((struct s3*) 0)->anInt);
 // CHECK-FUNCTIONS: define i32 @test3(
 int test3(struct s3 *ptr) {
   // CHECK-FUNCTIONS:      [[PTR:%.*]] = getelementptr inbounds {{%.*}}* {{%.*}}, i32 0, i32 1
-  // CHECK-FUNCTIONS-NEXT: load i32* [[PTR]], align 2
+  // CHECK-FUNCTIONS-NEXT: load i32* [[PTR]], align 1
   return ptr->anInt;
 }