From 682a56b15ae01cc8154d4800d29498da93911981 Mon Sep 17 00:00:00 2001 From: Alp Toker <alp@nuanti.com> Date: Thu, 17 Oct 2013 21:00:19 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192921 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/Sema.h | 2 +- lib/Sema/Sema.cpp | 5 --- lib/Sema/SemaDeclCXX.cpp | 46 +++++++++++----------- test/SemaTemplate/exception-spec-crash.cpp | 30 -------------- 4 files changed, 24 insertions(+), 59 deletions(-) delete mode 100644 test/SemaTemplate/exception-spec-crash.cpp diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 4ac00b2fed..f5a93d442c 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -4789,7 +4789,7 @@ public: void CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD); void CheckExplicitlyDefaultedMemberExceptionSpec(CXXMethodDecl *MD, const FunctionProtoType *T); - void CheckDelayedMemberExceptionSpecs(); + void CheckDelayedExplicitlyDefaultedMemberExceptionSpecs(); //===--------------------------------------------------------------------===// // C++ Derived Classes diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 31de6524a4..59648441a6 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -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. diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 0355a981b2..bd864b3adb 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -4864,27 +4864,14 @@ void Sema::CheckExplicitlyDefaultedMemberExceptionSpec( 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::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, } 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, diff --git a/test/SemaTemplate/exception-spec-crash.cpp b/test/SemaTemplate/exception-spec-crash.cpp deleted file mode 100644 index 4d9355974c..0000000000 --- a/test/SemaTemplate/exception-spec-crash.cpp +++ /dev/null @@ -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_; -}; -- 2.40.0