[cfe-commits] r162947 - in /cfe/trunk: lib/Sema/SemaDecl.cpp test/SemaCXX/cxx98-compat.cpp
Douglas Gregor
dgregor at apple.com
Thu Aug 30 14:47:37 PDT 2012
Author: dgregor
Date: Thu Aug 30 16:47:37 2012
New Revision: 162947
URL: http://llvm.org/viewvc/llvm-project?rev=162947&view=rev
Log:
The presence of a user-*declared* constructor makes the default
constructor not user provided (and, therefore, non-trivial). Fixes
<rdar://problem/11736429>.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/SemaCXX/cxx98-compat.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=162947&r1=162946&r2=162947&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Aug 30 16:47:37 2012
@@ -9507,12 +9507,12 @@
return false;
}
-/// If the given constructor is user-provided, produce a diagnostic explaining
+/// If the given constructor is user-declared, produce a diagnostic explaining
/// that it makes the class non-trivial.
-static bool DiagnoseNontrivialUserProvidedCtor(Sema &S, QualType QT,
+static bool diagnoseNonTrivialUserDeclaredCtor(Sema &S, QualType QT,
CXXConstructorDecl *CD,
Sema::CXXSpecialMember CSM) {
- if (!CD->isUserProvided())
+ if (CD->isImplicit())
return false;
SourceLocation CtorLoc = CD->getLocation();
@@ -9535,17 +9535,17 @@
if (RD->hasUserDeclaredConstructor()) {
typedef CXXRecordDecl::ctor_iterator ctor_iter;
for (ctor_iter CI = RD->ctor_begin(), CE = RD->ctor_end(); CI != CE; ++CI)
- if (DiagnoseNontrivialUserProvidedCtor(*this, QT, *CI, member))
+ if (diagnoseNonTrivialUserDeclaredCtor(*this, QT, *CI, member))
return;
- // No user-provided constructors; look for constructor templates.
+ // No user-delcared constructors; look for constructor templates.
typedef CXXRecordDecl::specific_decl_iterator<FunctionTemplateDecl>
tmpl_iter;
for (tmpl_iter TI(RD->decls_begin()), TE(RD->decls_end());
TI != TE; ++TI) {
CXXConstructorDecl *CD =
dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl());
- if (CD && DiagnoseNontrivialUserProvidedCtor(*this, QT, CD, member))
+ if (CD && diagnoseNonTrivialUserDeclaredCtor(*this, QT, CD, member))
return;
}
}
Modified: cfe/trunk/test/SemaCXX/cxx98-compat.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx98-compat.cpp?rev=162947&r1=162946&r2=162947&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx98-compat.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx98-compat.cpp Thu Aug 30 16:47:37 2012
@@ -362,3 +362,14 @@
b y; // expected-warning {{union member 'y' with a non-trivial copy assignment operator is incompatible with C++98}}
};
}
+
+namespace rdar11736429 {
+ struct X {
+ X(const X&) = delete; // expected-warning{{deleted function definitions are incompatible with C++98}} \
+ // expected-note{{because type 'rdar11736429::X' has a user-declared constructor}}
+ };
+
+ union S {
+ X x; // expected-warning{{union member 'x' with a non-trivial constructor is incompatible with C++98}}
+ };
+}
More information about the cfe-commits
mailing list