summaryrefslogtreecommitdiff
path: root/test/CXX
diff options
context:
space:
mode:
authorJacob Bandes-Storch <jacob@bandes-stor.ch>2017-12-31 18:27:29 +0000
committerJacob Bandes-Storch <jacob@bandes-stor.ch>2017-12-31 18:27:29 +0000
commit7a65af2a3afadd2ed099e9fa839ea0ac746933b4 (patch)
tree7d42b4e238627fc67e8dee298b276ce0fdf26169 /test/CXX
parent352a8a419d7c9515bd05787c0390238f609cd4ae (diff)
[Sema] Improve diagnostics for const- and ref-qualified member functions
(Re-submission of D39937 with fixed tests.) Adjust wording for const-qualification mismatch to be a little more clear. Also add another diagnostic for a ref qualifier mismatch, which previously produced a useless error (this error path is simply very old; see rL119336): Before: error: cannot initialize object parameter of type 'X0' with an expression of type 'X0' After: error: 'this' argument to member function 'rvalue' is an lvalue, but function has rvalue ref-qualifier Reviewers: aaron.ballman Reviewed By: aaron.ballman Subscribers: lebedev.ri, cfe-commits Differential Revision: https://reviews.llvm.org/D41646 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@321609 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CXX')
-rw-r--r--test/CXX/over/over.match/over.match.funcs/p4-0x.cpp38
-rw-r--r--test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp2
2 files changed, 37 insertions, 3 deletions
diff --git a/test/CXX/over/over.match/over.match.funcs/p4-0x.cpp b/test/CXX/over/over.match/over.match.funcs/p4-0x.cpp
index 68c79900b9..df7762703c 100644
--- a/test/CXX/over/over.match/over.match.funcs/p4-0x.cpp
+++ b/test/CXX/over/over.match/over.match.funcs/p4-0x.cpp
@@ -1,5 +1,4 @@
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
-// expected-no-diagnostics
template<typename T> T &lvalue();
template<typename T> T &&xvalue();
@@ -20,6 +19,18 @@ struct X0 {
void g();
+ void c() const; // expected-note {{'c' declared here}}
+ void v() volatile; // expected-note {{'v' declared here}}
+ void r() __restrict__; // expected-note {{'r' declared here}}
+ void cr() const __restrict__; // expected-note {{'cr' declared here}}
+ void cv() const volatile;
+ void vr() volatile __restrict__; // expected-note {{'vr' declared here}}
+ void cvr() const volatile __restrict__;
+
+ void lvalue() &; // expected-note 2 {{'lvalue' declared here}}
+ void const_lvalue() const&;
+ void rvalue() &&; // expected-note {{'rvalue' declared here}}
+
int &operator+(const X0&) &;
float &operator+(const X0&) &&;
@@ -32,7 +43,7 @@ struct X0 {
float &h2() const&&;
};
-void X0::g() {
+void X0::g() { // expected-note {{'g' declared here}}
int &ir1 = f();
int &ir2 = X0::f();
}
@@ -69,3 +80,26 @@ void test_ref_qualifier_overloading() {
float &fr3 = xvalue<X0>().h2();
float &fr4 = prvalue<X0>().h2();
}
+
+void test_diagnostics(const volatile X0 &__restrict__ cvr) {
+ cvr.g(); // expected-error {{'this' argument to member function 'g' has type 'const volatile X0', but function is not marked const or volatile}}
+ cvr.c(); // expected-error {{not marked volatile}}
+ cvr.v(); // expected-error {{not marked const}}
+ cvr.r(); // expected-error {{not marked const or volatile}}
+ cvr.cr(); // expected-error {{not marked volatile}}
+ cvr.cv();
+ cvr.vr(); // expected-error {{not marked const}}
+ cvr.cvr();
+
+ lvalue<X0>().lvalue();
+ lvalue<X0>().const_lvalue();
+ lvalue<X0>().rvalue(); // expected-error {{'this' argument to member function 'rvalue' is an lvalue, but function has rvalue ref-qualifier}}
+
+ xvalue<X0>().lvalue(); // expected-error {{'this' argument to member function 'lvalue' is an rvalue, but function has non-const lvalue ref-qualifier}}
+ xvalue<X0>().const_lvalue();
+ xvalue<X0>().rvalue();
+
+ prvalue<X0>().lvalue(); // expected-error {{'this' argument to member function 'lvalue' is an rvalue, but function has non-const lvalue ref-qualifier}}
+ prvalue<X0>().const_lvalue();
+ prvalue<X0>().rvalue();
+}
diff --git a/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp b/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp
index ad60868358..34202494c0 100644
--- a/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp
+++ b/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp
@@ -215,7 +215,7 @@ template void h<A(&)[13], int>(A(&)[13]); // expected-note {{requested here}}
template<typename T>
void i(T t) {
for (auto u : t) { // expected-error {{invalid range expression of type 'X::A *'; no viable 'begin' function available}} \
- expected-error {{member function 'begin' not viable}} \
+ expected-error {{'this' argument to member function 'begin' has type 'const X::A', but function is not marked const}} \
expected-note {{when looking up 'begin' function}}
}