[cfe-commits] r131223 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp

Sean Hunt scshunt at csclub.uwaterloo.ca
Wed May 11 20:51:48 PDT 2011


Author: coppro
Date: Wed May 11 22:51:48 2011
New Revision: 131223

URL: http://llvm.org/viewvc/llvm-project?rev=131223&view=rev
Log:
Implement deletion of explicitly defaulted default constructors.

We still don't parse out-of-line defaults correctly, which is needed to
get the full effect out of this patch.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=131223&r1=131222&r2=131223&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed May 11 22:51:48 2011
@@ -3632,6 +3632,10 @@
   "an explicitly-defaulted default constructor must have no parameters">;
 def err_incorrect_defaulted_exception_spec : Error<
   "exception specification of explicitly defaulted function is incorrect">;
+def err_out_of_line_default_deletes : Error<
+  "defaulting this %select{default constructor|copy constructor|copy "
+  "assignment operator|destructor}0 would delete it after its first "
+  "declaration">;
 
 def warn_array_index_precedes_bounds : Warning<
   "array index of '%0' indexes before the beginning of the array">,

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=131223&r1=131222&r2=131223&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed May 11 22:51:48 2011
@@ -1518,7 +1518,6 @@
   if (MD->isCopyAssignmentOperator())
     return Sema::CXXCopyAssignment;
 
-  llvm_unreachable("getSpecialMember on non-special member");
   return Sema::CXXInvalid;
 }
 
@@ -4220,9 +4219,6 @@
 
       isVirtualOkay = !isStatic;
     } else {
-      if (DefaultLoc.isValid())
-        Diag(DefaultLoc, diag::err_default_special_members);
-
       // Determine whether the function was written with a
       // prototype. This true when:
       //   - we're in C++ (where every function has a prototype),
@@ -4778,33 +4774,13 @@
         }
       }
 
-  // Check explicitly defaulted methods
-  // FIXME: This could be made better through CXXSpecialMember if it did
-  // default constructors (which it should rather than any constructor).
-  if (NewFD && DefaultLoc.isValid() && getLangOptions().CPlusPlus) {
-    if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD)) {
-      if (CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(MD)) {
-        if (CD->isDefaultConstructor() || CD->isCopyOrMoveConstructor()) {
-          CD->setDefaulted();
-          CD->setExplicitlyDefaulted();
-          if (CD != CD->getCanonicalDecl() && CD->isDefaultConstructor())
-            CheckExplicitlyDefaultedDefaultConstructor(CD);
-          // FIXME: Do copy/move ctors here.
-        } else {
-          Diag(DefaultLoc, diag::err_default_special_members);
-        }
-      } else if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
-        DD->setDefaulted();
-        DD->setExplicitlyDefaulted();
-        // FIXME: Add a checking method
-      } else if (MD->isCopyAssignmentOperator() /* ||
-                 MD->isMoveAssignmentOperator() */) {
-        MD->setDefaulted();
-        MD->setExplicitlyDefaulted();
-        // FIXME: Add a checking method
-      } else {
-        Diag(DefaultLoc, diag::err_default_special_members);
-      }
+  if (DefaultLoc.isValid()) {
+    CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
+    if (MD && getSpecialMember(MD) != CXXInvalid) {
+      MD->setExplicitlyDefaulted();
+      MD->setDefaulted();
+    } else {
+      Diag(DefaultLoc, diag::err_default_special_members);
     }
   }
 

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=131223&r1=131222&r2=131223&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed May 11 22:51:48 2011
@@ -3057,6 +3057,14 @@
     // We know there are no parameters.
     CD->setType(Context.getFunctionType(Context.VoidTy, 0, 0, EPI));
   }
+
+  if (ShouldDeleteDefaultConstructor(CD)) {
+    if (First)
+      CD->setDeletedAsWritten();
+    else
+      Diag(CD->getLocation(), diag::err_out_of_line_default_deletes)
+        << getSpecialMember(CD);
+  }
 }
 
 bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) {





More information about the cfe-commits mailing list