Author: rtrieu
Date: Tue Sep 27 17:28:59 2016
New Revision: 282547

URL: http://llvm.org/viewvc/llvm-project?rev=282547&view=rev
Log:
Fix defaulted member functions for templated classes.

In some cases, non-special member functions were being marked as being defaulted
in templated classes.  This can cause interactions with later code that expects
the default function to be one of the specific member functions.  Fix the check
so that templated class members are checked the same way as non-templated class
members are.

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=282547&r1=282546&r2=282547&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Sep 27 17:28:59 2016
@@ -13850,12 +13850,6 @@ void Sema::SetDeclDefaulted(Decl *Dcl, S
   CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(Dcl);
 
   if (MD) {
-    if (MD->getParent()->isDependentType()) {
-      MD->setDefaulted();
-      MD->setExplicitlyDefaulted();
-      return;
-    }
-
     CXXSpecialMember Member = getSpecialMember(MD);
     if (Member == CXXInvalid) {
       if (!MD->isInvalidDecl())
@@ -13866,6 +13860,8 @@ void Sema::SetDeclDefaulted(Decl *Dcl, S
     MD->setDefaulted();
     MD->setExplicitlyDefaulted();
 
+    if (MD->getParent()->isDependentType()) return;
+
     // If this definition appears within the record, do the checking when
     // the record is complete.
     const FunctionDecl *Primary = MD;

Modified: cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp?rev=282547&r1=282546&r2=282547&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp Tue Sep 27 17:28:59 
2016
@@ -208,3 +208,31 @@ int fn() {
   t = true;
 }
 }
+
+namespace templated_class {
+template <typename T>
+class X {
+    X() = default;
+    X(const X&) = default;
+    X(X&&) = default;
+    X &operator=(const X&) = default;
+    X &operator=(X&&) = default;
+    ~X() = default;
+
+    X(T) = default;  // expected-error {{only special member functions may be 
defaulted}}
+    void Run() = default;  // expected-error {{only special member functions 
may be defaulted}}
+
+  };
+  template <typename T>
+  X<T>::X() = default; // expected-error {{definition of explicitly defaulted}}
+  template <typename T>
+  X<T>::X(const X<T>&) = default; // expected-error {{definition of explicitly 
defaulted}}
+  template <typename T>
+  X<T>::X(X<T>&&) = default; // expected-error {{definition of explicitly 
defaulted}}
+  template <typename T>
+  X<T> &X<T>::operator=(const X<T>&) = default; // expected-error {{definition 
of explicitly defaulted}}
+  template <typename T>
+  X<T> &X<T>::operator=(X<T>&&) = default; // expected-error {{definition of 
explicitly defaulted}}
+  template <typename T>
+  X<T>::~X() = default; // expected-error {{definition of explicitly 
defaulted}}
+}


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to