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'}}
}