[CodeGen] Fix a crash that occurs when a non-trivial C struct with a
volatile array field is copied.

The crash occurs because method 'visitArray' passes a null FieldDecl to
method 'visit' and some of the methods called downstream expect a
non-null FieldDecl to be passed.

This reapplies r330151 with a fix to the test case.

rdar://problem/33599681

llvm-svn: 330155
diff --git a/clang/test/CodeGenObjC/strong-in-c-struct.m b/clang/test/CodeGenObjC/strong-in-c-struct.m
index 6310943..36e9049 100644
--- a/clang/test/CodeGenObjC/strong-in-c-struct.m
+++ b/clang/test/CodeGenObjC/strong-in-c-struct.m
@@ -70,6 +70,11 @@
   volatile char i6;
 } Bitfield1;
 
+typedef struct {
+  id x;
+  volatile int a[16];
+} VolatileArray ;
+
 #endif
 
 #ifdef USESTRUCT
@@ -540,4 +545,19 @@
   U t;
 }
 
+// CHECK: define void @test_copy_constructor_VolatileArray(
+// CHECK: call void @__copy_constructor_8_8_s0_AB8s4n16_tv64w32_AE(
+
+// CHECK: define linkonce_odr hidden void @__copy_constructor_8_8_s0_AB8s4n16_tv64w32_AE(
+// CHECK: %[[ADDR_CUR:.*]] = phi i8**
+// CHECK: %[[ADDR_CUR1:.*]] = phi i8**
+// CHECK: %[[V12:.*]] = bitcast i8** %[[ADDR_CUR]] to i32*
+// CHECK: %[[V13:.*]] = bitcast i8** %[[ADDR_CUR1]] to i32*
+// CHECK: %[[V14:.*]] = load volatile i32, i32* %[[V13]], align 4
+// CHECK: store volatile i32 %[[V14]], i32* %[[V12]], align 4
+
+void test_copy_constructor_VolatileArray(VolatileArray *a) {
+  VolatileArray t = *a;
+}
+
 #endif /* USESTRUCT */