PR15132: Replace "address expression must be an lvalue or a function
designator" diagnostic with more correct and more human-friendly "cannot take
address of rvalue of type 'T'".

For the case of & &T::f, provide a custom diagnostic, rather than unhelpfully
saying "cannot take address of rvalue of type '<overloaded function type>'".

For the case of &array_temporary, treat it just like a class temporary
(including allowing it as an extension); the existing diagnostic wording
for the class temporary case works fine.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174262 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Sema/expr-address-of.c b/test/Sema/expr-address-of.c
index 2b8cfbf..32bd0df 100644
--- a/test/Sema/expr-address-of.c
+++ b/test/Sema/expr-address-of.c
@@ -90,8 +90,8 @@
      lvalue we would need to give a warning. Note that gcc warns about
      this as a register before it warns about it as an invalid
      lvalue. */
-  int *_dummy0 = &(int*) arr; // expected-error {{address expression must be an lvalue or a function designator}}
-  int *_dummy1 = &(arr + 1); // expected-error {{address expression must be an lvalue or a function designator}}
+  int *_dummy0 = &(int*) arr; // expected-error {{cannot take the address of an rvalue}}
+  int *_dummy1 = &(arr + 1); // expected-error {{cannot take the address of an rvalue}}
 }
 
 void f6(register int x) {
@@ -109,12 +109,12 @@
 }
 
 void f8() {
-  void *dummy0 = &f8(); // expected-error {{address expression must be an lvalue or a function designator}}
+  void *dummy0 = &f8(); // expected-error {{cannot take the address of an rvalue of type 'void'}}
 
   extern void v;
-  void *dummy1 = &(1 ? v : f8()); // expected-error {{address expression must be an lvalue or a function designator}}
+  void *dummy1 = &(1 ? v : f8()); // expected-error {{cannot take the address of an rvalue of type 'void'}}
 
-  void *dummy2 = &(f8(), v); // expected-error {{address expression must be an lvalue or a function designator}}
+  void *dummy2 = &(f8(), v); // expected-error {{cannot take the address of an rvalue of type 'void'}}
 
-  void *dummy3 = &({ ; }); // expected-error {{address expression must be an lvalue or a function designator}}
+  void *dummy3 = &({ ; }); // expected-error {{cannot take the address of an rvalue of type 'void'}}
 }