Author: alp Date: Thu Oct 17 16:00:19 2013 New Revision: 192921 URL: http://llvm.org/viewvc/llvm-project?rev=192921&view=rev Log: Revert "Fix missed exception spec checks and crashes"
The changes caused the sanitizer bot to hang: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/2311 Needs investigation. This reverts commit r192914. Removed: cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/Sema.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=192921&r1=192920&r2=192921&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Thu Oct 17 16:00:19 2013 @@ -4789,7 +4789,7 @@ public: void CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD); void CheckExplicitlyDefaultedMemberExceptionSpec(CXXMethodDecl *MD, const FunctionProtoType *T); - void CheckDelayedMemberExceptionSpecs(); + void CheckDelayedExplicitlyDefaultedMemberExceptionSpecs(); //===--------------------------------------------------------------------===// // C++ Derived Classes Modified: cfe/trunk/lib/Sema/Sema.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=192921&r1=192920&r2=192921&view=diff ============================================================================== --- cfe/trunk/lib/Sema/Sema.cpp (original) +++ cfe/trunk/lib/Sema/Sema.cpp Thu Oct 17 16:00:19 2013 @@ -792,11 +792,6 @@ void Sema::ActOnEndOfTranslationUnit() { } } - // All delayed member exception specs should be checked or we end up accepting - // incompatible declarations. - assert(DelayedDefaultedMemberExceptionSpecs.empty()); - assert(DelayedDestructorExceptionSpecChecks.empty()); - // Check we've noticed that we're no longer parsing the initializer for every // variable. If we miss cases, then at best we have a performance issue and // at worst a rejects-valid bug. Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=192921&r1=192920&r2=192921&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Oct 17 16:00:19 2013 @@ -4864,27 +4864,14 @@ void Sema::CheckExplicitlyDefaultedMembe SpecifiedType, MD->getLocation()); } -void Sema::CheckDelayedMemberExceptionSpecs() { - // Perform any deferred checking of exception specifications for virtual - // destructors. - while (!DelayedDestructorExceptionSpecChecks.empty()) { - std::pair<const CXXDestructorDecl *, const CXXDestructorDecl *> Check = - DelayedDestructorExceptionSpecChecks.pop_back_val(); - const CXXDestructorDecl *Dtor = Check.first; - assert(!Dtor->getParent()->isDependentType() && - "Should not ever add destructors of templates into the list."); - CheckOverridingFunctionExceptionSpec(Dtor, Check.second); - } - - // Check that any explicitly-defaulted methods have exception specifications - // compatible with their implicit exception specifications. - while (!DelayedDefaultedMemberExceptionSpecs.empty()) { - std::pair<CXXMethodDecl *, const FunctionProtoType *> Spec = - DelayedDefaultedMemberExceptionSpecs.pop_back_val(); - CheckExplicitlyDefaultedMemberExceptionSpec(Spec.first, Spec.second); - } +void Sema::CheckDelayedExplicitlyDefaultedMemberExceptionSpecs() { + for (unsigned I = 0, N = DelayedDefaultedMemberExceptionSpecs.size(); + I != N; ++I) + CheckExplicitlyDefaultedMemberExceptionSpec( + DelayedDefaultedMemberExceptionSpecs[I].first, + DelayedDefaultedMemberExceptionSpecs[I].second); - assert(DelayedDestructorExceptionSpecChecks.empty()); + DelayedDefaultedMemberExceptionSpecs.clear(); } namespace { @@ -8195,8 +8182,9 @@ void Sema::DefineImplicitDefaultConstruc } void Sema::ActOnFinishDelayedMemberInitializers(Decl *D) { - // Perform any delayed checks on exception specifications. - CheckDelayedMemberExceptionSpecs(); + // Check that any explicitly-defaulted methods have exception specifications + // compatible with their implicit exception specifications. + CheckDelayedExplicitlyDefaultedMemberExceptionSpecs(); // Once all the member initializers are processed, perform checks to see if // any unintialized use is happeneing. @@ -8719,11 +8707,23 @@ void Sema::ActOnFinishCXXMemberDecls() { // If the context is an invalid C++ class, just suppress these checks. if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(CurContext)) { if (Record->isInvalidDecl()) { - DelayedDefaultedMemberExceptionSpecs.clear(); DelayedDestructorExceptionSpecChecks.clear(); return; } } + + // Perform any deferred checking of exception specifications for virtual + // destructors. + for (unsigned i = 0, e = DelayedDestructorExceptionSpecChecks.size(); + i != e; ++i) { + const CXXDestructorDecl *Dtor = + DelayedDestructorExceptionSpecChecks[i].first; + assert(!Dtor->getParent()->isDependentType() && + "Should not ever add destructors of templates into the list."); + CheckOverridingFunctionExceptionSpec(Dtor, + DelayedDestructorExceptionSpecChecks[i].second); + } + DelayedDestructorExceptionSpecChecks.clear(); } void Sema::AdjustDestructorExceptionSpec(CXXRecordDecl *ClassDecl, Removed: cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp?rev=192920&view=auto ============================================================================== --- cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp (original) +++ cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp (removed) @@ -1,30 +0,0 @@ -// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -DCXX_EXCEPTIONS -fsyntax-only -verify %s - -template <class _Tp> struct is_nothrow_move_constructible { - static const bool value = false; -}; - -template <class _Tp> -class allocator; - -template <> -class allocator<char> {}; - -template <class _Allocator> -class basic_string { - typedef _Allocator allocator_type; - basic_string(basic_string &&__str) - noexcept(is_nothrow_move_constructible<allocator_type>::value); -}; - -class Foo { - Foo(Foo &&) noexcept = default; -#ifdef CXX_EXCEPTIONS -// expected-error@-2 {{does not match the calculated}} -#else -// expected-no-diagnostics -#endif - Foo &operator=(Foo &&) noexcept = default; - basic_string<allocator<char> > vectorFoo_; -}; _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
