From: Benjamin Kramer Date: Mon, 30 Jul 2012 16:41:40 +0000 (+0000) Subject: Use the location of the copy assignment when diagnosing classes that are nontrivial... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e5e8f4d2db48ec21f537fd6452276c1fe26bc726;p=clang Use the location of the copy assignment when diagnosing classes that are nontrivial because of it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160962 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 81b94a4ecd..6dfd796f40 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -9513,10 +9513,9 @@ void Sema::DiagnoseNontrivial(const RecordType* T, CXXSpecialMember member) { case CXXCopyAssignment: if (RD->hasUserDeclaredCopyAssignment()) { - // FIXME: this should use the location of the copy - // assignment, not the type. - SourceLocation TyLoc = RD->getLocStart(); - Diag(TyLoc, diag::note_nontrivial_user_defined) << QT << member; + SourceLocation AssignLoc = + RD->getCopyAssignmentOperator(0)->getLocation(); + Diag(AssignLoc, diag::note_nontrivial_user_defined) << QT << member; return; } break; diff --git a/test/SemaCXX/cxx98-compat.cpp b/test/SemaCXX/cxx98-compat.cpp index 9bd854a664..37341f8856 100644 --- a/test/SemaCXX/cxx98-compat.cpp +++ b/test/SemaCXX/cxx98-compat.cpp @@ -346,3 +346,19 @@ namespace PR13480 { basic_iterator it; // expected-warning {{union member 'it' with a non-trivial copy constructor is incompatible with C++98}} }; } + +namespace AssignOpUnion { + struct a { + void operator=(const a &it) {} + void operator=(a &it) {} // expected-note {{because type 'AssignOpUnion::a' has a user-declared copy assignment operator}} + }; + + struct b { + void operator=(const b &it) {} // expected-note {{because type 'AssignOpUnion::b' has a user-declared copy assignment operator}} + }; + + union test1 { + a x; // expected-warning {{union member 'x' with a non-trivial copy assignment operator is incompatible with C++98}} + b y; // expected-warning {{union member 'y' with a non-trivial copy assignment operator is incompatible with C++98}} + }; +}