aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-07-30 16:41:40 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-07-30 16:41:40 +0000
commite5e8f4d2db48ec21f537fd6452276c1fe26bc726 (patch)
tree0eb005d08b5600bb354c9e5280813c2a5265974e
parent2cd7f41f4eb2b02568664132253f8e1d9cf381dd (diff)
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
-rw-r--r--lib/Sema/SemaDecl.cpp7
-rw-r--r--test/SemaCXX/cxx98-compat.cpp16
2 files changed, 19 insertions, 4 deletions
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}}
+ };
+}