diff options
author | Jacob Bandes-Storch <jacob@bandes-stor.ch> | 2017-12-31 18:27:29 +0000 |
---|---|---|
committer | Jacob Bandes-Storch <jacob@bandes-stor.ch> | 2017-12-31 18:27:29 +0000 |
commit | 7a65af2a3afadd2ed099e9fa839ea0ac746933b4 (patch) | |
tree | 7d42b4e238627fc67e8dee298b276ce0fdf26169 /test/SemaCXX | |
parent | 352a8a419d7c9515bd05787c0390238f609cd4ae (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/SemaCXX')
-rw-r--r-- | test/SemaCXX/copy-initialization.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/cxx1y-contextual-conversion-tweaks.cpp | 10 | ||||
-rw-r--r-- | test/SemaCXX/cxx2a-pointer-to-const-ref-member.cpp | 4 |
3 files changed, 8 insertions, 8 deletions
diff --git a/test/SemaCXX/copy-initialization.cpp b/test/SemaCXX/copy-initialization.cpp index 4f6c65cf55..cd7e5f07e1 100644 --- a/test/SemaCXX/copy-initialization.cpp +++ b/test/SemaCXX/copy-initialization.cpp @@ -26,7 +26,7 @@ struct foo { }; // PR3600 -void test(const foo *P) { P->bar(); } // expected-error{{'bar' not viable: 'this' argument has type 'const foo', but function is not marked const}} +void test(const foo *P) { P->bar(); } // expected-error{{'this' argument to member function 'bar' has type 'const foo', but function is not marked const}} namespace PR6757 { struct Foo { diff --git a/test/SemaCXX/cxx1y-contextual-conversion-tweaks.cpp b/test/SemaCXX/cxx1y-contextual-conversion-tweaks.cpp index c7e6074a44..7cb83c6f88 100644 --- a/test/SemaCXX/cxx1y-contextual-conversion-tweaks.cpp +++ b/test/SemaCXX/cxx1y-contextual-conversion-tweaks.cpp @@ -96,8 +96,8 @@ namespace extended_examples { //expected-error@81 {{statement requires expression of integer type ('extended_examples::A1' invalid)}} //expected-error@85 {{statement requires expression of integer type ('extended_examples::B2' invalid)}} #else -//expected-error@81 {{cannot initialize object parameter of type 'extended_examples::A1' with an expression of type 'extended_examples::A1'}} -//expected-error@85 {{cannot initialize object parameter of type 'extended_examples::B2' with an expression of type 'extended_examples::B2'}} +//expected-error@81 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@54 {{'operator int' declared here}} +//expected-error@85 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@75 {{'operator int' declared here}} #endif namespace extended_examples_cxx1y { @@ -149,9 +149,9 @@ namespace extended_examples_cxx1y { #ifdef CXX1Y //expected-error@139 {{statement requires expression of integer type ('extended_examples_cxx1y::A2' invalid)}} #else -//expected-error@138 {{cannot initialize object parameter of type 'extended_examples_cxx1y::A1' with an expression of type 'extended_examples_cxx1y::A1'}} -//expected-error@139 {{cannot initialize object parameter of type 'extended_examples_cxx1y::A2' with an expression of type 'extended_examples_cxx1y::A2'}} -//expected-error@143 {{cannot initialize object parameter of type 'extended_examples_cxx1y::D' with an expression of type 'extended_examples_cxx1y::D'}} +//expected-error@138 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@106 {{'operator int' declared here}} +//expected-error@139 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@111 {{'operator int' declared here}} +//expected-error@143 {{'this' argument to member function 'operator int' is an lvalue, but function has rvalue ref-qualifier}} expected-note@131 {{'operator int' declared here}} #endif namespace extended_examples_array_bounds { diff --git a/test/SemaCXX/cxx2a-pointer-to-const-ref-member.cpp b/test/SemaCXX/cxx2a-pointer-to-const-ref-member.cpp index e9cbb1a185..0bc40c8179 100644 --- a/test/SemaCXX/cxx2a-pointer-to-const-ref-member.cpp +++ b/test/SemaCXX/cxx2a-pointer-to-const-ref-member.cpp @@ -1,12 +1,12 @@ // RUN: %clang_cc1 -std=c++2a %s -verify struct X { - void ref() & {} + void ref() & {} // expected-note{{'ref' declared here}} void cref() const& {} }; void test() { - X{}.ref(); // expected-error{{cannot initialize object parameter of type 'X' with an expression of type 'X'}} + X{}.ref(); // expected-error{{'this' argument to member function 'ref' is an rvalue, but function has non-const lvalue ref-qualifier}} X{}.cref(); // expected-no-error (X{}.*&X::ref)(); // expected-error-re{{pointer-to-member function type 'void (X::*)() {{.*}}&' can only be called on an lvalue}} |