Author: rtrieu Date: Tue Sep 27 18:44:07 2016 New Revision: 282555 URL: http://llvm.org/viewvc/llvm-project?rev=282555&view=rev Log: Revert r282547 and add test to show correct behavior.
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=282555&r1=282554&r2=282555&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Sep 27 18:44:07 2016 @@ -13850,6 +13850,12 @@ 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()) @@ -13860,8 +13866,6 @@ 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=282555&r1=282554&r2=282555&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp Tue Sep 27 18:44:07 2016 @@ -209,30 +209,29 @@ int fn() { } } -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}} +namespace dependent_classes { +template <bool B, typename X, typename Y> +struct conditional; + +template <typename X, typename Y> +struct conditional<true, X, Y> { typedef X type; }; + +template <typename X, typename Y> +struct conditional<false, X, Y> { typedef Y type; }; + +template<bool B> struct X { + X(); + + // B == false triggers error for = default. + using T = typename conditional<B, const X &, int>::type; + X(T) = default; // expected-error {{only special member functions}} + + // Either value of B creates a constructor that can be default + using U = typename conditional<B, X&&, const X&>::type; + X(U) = default; +}; + +X<true> x1; +X<false> x2; // expected-note {{in instantiation}} + } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits