Some cleanup and bug-fixing for address-of checking.  This causes a couple of 
minor accepts-invalid regressions, but we weren't really rejecting them for 
the right reason.  We really need a more general solution to detect all the 
cases of the promotion of arrays with a register storage class.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69586 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Sema/expr-address-of.c b/test/Sema/expr-address-of.c
index b3ea9c5..909acfb 100644
--- a/test/Sema/expr-address-of.c
+++ b/test/Sema/expr-address-of.c
@@ -45,18 +45,21 @@
   int *_dummy1 = &(*(x1 + 1));
 }
 
+// FIXME: The checks for this function are broken; we should error
+// on promoting a register array to a pointer! (C99 6.3.2.1p3)
 void f1() {
   register int x0[10];
-  int *_dummy0 = &(*x0); // expected-error {{address of register variable requested}}
+  int *_dummy00 = x0; // fixme-error {{address of register variable requested}}
+  int *_dummy01 = &(*x0); // fixme-error {{address of register variable requested}}
 
   register int x1[10];
-  int *_dummy1 = &(*(x1 + 1)); // expected-error {{address of register variable requested}}
+  int *_dummy1 = &(*(x1 + 1)); // fixme-error {{address of register variable requested}}
 
   register int *x2;
   int *_dummy2 = &(*(x2 + 1));
 
   register int x3[10][10][10];
-  int *_dummy3 = &x3[0][0]; // expected-error {{address of register variable requested}}
+  int (*_dummy3)[10] = &x3[0][0]; // expected-error {{address of register variable requested}}
 
   register struct { int f0[10]; } x4;
   int *_dummy4 = &x4.f0[2]; // expected-error {{address of register variable requested}}
@@ -94,3 +97,13 @@
 void f6(register int x) {
   int * dummy0 = &x; // expected-error {{address of register variable requested}}
 }
+
+char* f7() {
+  register struct {char* x;} t1 = {"Hello"};
+  char* dummy1 = &(t1.x[0]);
+
+  struct {int a : 10;} t2;
+  int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}}
+
+  void* t3 = &(*(void*)0);
+}