From: John McCall Date: Tue, 20 Sep 2011 06:21:28 +0000 (+0000) Subject: Fix a crash-on-invalid with bad CV-qualification on 'this' in the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d8c2b61519cb05ac6737cc542e274f9e2e0552a;p=clang Fix a crash-on-invalid with bad CV-qualification on 'this' in the presence of an implicit move assignment operator. I think the implicit copy assignment operator case was also wrong, but just in a "displaying the wrong diagnostic" way. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140139 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 494060f221..aa81c3aa1c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1790,15 +1790,18 @@ def note_ovl_candidate_bad_ownership : Note<"candidate " "function |function |constructor |" "constructor (the implicit default constructor)|" "constructor (the implicit copy constructor)|" + "constructor (the implicit move constructor)|" "function (the implicit copy assignment operator)|" + "function (the implicit move assignment operator)|" "constructor (inherited)}0%1 not viable: " "%select{%ordinal6|'this'}5 argument (%2) has " "%select{no|__unsafe_unretained|__strong|__weak|__autoreleasing}3 ownership," " but parameter has %select{no|__unsafe_unretained|__strong|__weak|" "__autoreleasing}4 ownership">; def note_ovl_candidate_bad_cvr_this : Note<"candidate " - "%select{|function|||function||||" - "function (the implicit copy assignment operator)|}0 not viable: " + "%select{|function|||function|||||" + "function (the implicit copy assignment operator)|" + "function (the implicit move assignment operator)|}0 not viable: " "'this' argument has type %2, but method is not marked " "%select{const|restrict|const or restrict|volatile|const or volatile|" "volatile or restrict|const, volatile, or restrict}3">; diff --git a/test/SemaCXX/overload-0x.cpp b/test/SemaCXX/overload-0x.cpp new file mode 100644 index 0000000000..e47877ea91 --- /dev/null +++ b/test/SemaCXX/overload-0x.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++0x -verify %s + +namespace test0 { + struct A { // expected-note {{candidate function (the implicit copy assignment operator) not viable: 'this' argument has type 'const test0::A', but method is not marked const}} expected-note {{candidate function (the implicit move assignment operator) not viable: 'this' argument has type 'const test0::A', but method is not marked const}} + A &operator=(void*); // expected-note {{candidate function not viable: 'this' argument has type 'const test0::A', but method is not marked const}} + }; + + void test(const A &a) { + a = "help"; // expected-error {{no viable overloaded '='}} + } +}