Fix crash on zero-argument assignment operator.

Make sure we don't crash when checking whether an assignment operator
without any arguments is a special member.  <rdar://problem/14397774>.

llvm-svn: 186137
This commit is contained in:
Eli Friedman 2013-07-11 23:55:07 +00:00
parent 6d8a38c537
commit 84c0143ea0
3 changed files with 11 additions and 4 deletions

View File

@ -1406,7 +1406,8 @@ bool CXXMethodDecl::isCopyAssignmentOperator() const {
// type X, X&, const X&, volatile X& or const volatile X&. // type X, X&, const X&, volatile X& or const volatile X&.
if (/*operator=*/getOverloadedOperator() != OO_Equal || if (/*operator=*/getOverloadedOperator() != OO_Equal ||
/*non-static*/ isStatic() || /*non-static*/ isStatic() ||
/*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate()) /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
getNumParams() != 1)
return false; return false;
QualType ParamType = getParamDecl(0)->getType(); QualType ParamType = getParamDecl(0)->getType();
@ -1425,7 +1426,8 @@ bool CXXMethodDecl::isMoveAssignmentOperator() const {
// non-template member function of class X with exactly one parameter of type // non-template member function of class X with exactly one parameter of type
// X&&, const X&&, volatile X&&, or const volatile X&&. // X&&, const X&&, volatile X&&, or const volatile X&&.
if (getOverloadedOperator() != OO_Equal || isStatic() || if (getOverloadedOperator() != OO_Equal || isStatic() ||
getPrimaryTemplate() || getDescribedFunctionTemplate()) getPrimaryTemplate() || getDescribedFunctionTemplate() ||
getNumParams() != 1)
return false; return false;
QualType ParamType = getParamDecl(0)->getType(); QualType ParamType = getParamDecl(0)->getType();

View File

@ -11535,7 +11535,8 @@ void Sema::SetDeclDefaulted(Decl *Dcl, SourceLocation DefaultLoc) {
CXXSpecialMember Member = getSpecialMember(MD); CXXSpecialMember Member = getSpecialMember(MD);
if (Member == CXXInvalid) { if (Member == CXXInvalid) {
Diag(DefaultLoc, diag::err_default_special_members); if (!MD->isInvalidDecl())
Diag(DefaultLoc, diag::err_default_special_members);
return; return;
} }

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
class X { }; class X { };
X operator+(X, X); X operator+(X, X);
@ -441,3 +441,7 @@ namespace test10 {
a[bar<float>]; a[bar<float>];
} }
} }
struct InvalidOperatorEquals {
InvalidOperatorEquals operator=() = delete; // expected-error {{overloaded 'operator=' must be a binary operator}}
};