]> granicus.if.org Git - clang/commitdiff
The presence of a user-*declared* constructor makes the default
authorDouglas Gregor <dgregor@apple.com>
Thu, 30 Aug 2012 21:47:37 +0000 (21:47 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 30 Aug 2012 21:47:37 +0000 (21:47 +0000)
constructor not user provided (and, therefore, non-trivial). Fixes
<rdar://problem/11736429>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162947 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/cxx98-compat.cpp

index 082fb13fb55018c659622a836179e1490cce831c..048dbb68cbb7b2406ed2c90bc9997c9912884d31 100644 (file)
@@ -9507,12 +9507,12 @@ bool Sema::CheckNontrivialField(FieldDecl *FD) {
   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 @@ void Sema::DiagnoseNontrivial(const RecordType* T, CXXSpecialMember member) {
     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;
       }
     }
index 37341f8856190d82d6c43ea31dcff8c5bf0d4126..249195564ad4db879deec431ae93ab2de6ff37c2 100644 (file)
@@ -362,3 +362,14 @@ namespace AssignOpUnion {
     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}}
+  };
+}