]> granicus.if.org Git - clang/commitdiff
Revert "Fix missed exception spec checks and crashes"
authorAlp Toker <alp@nuanti.com>
Thu, 17 Oct 2013 21:00:19 +0000 (21:00 +0000)
committerAlp Toker <alp@nuanti.com>
Thu, 17 Oct 2013 21:00:19 +0000 (21:00 +0000)
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
lib/Sema/Sema.cpp
lib/Sema/SemaDeclCXX.cpp
test/SemaTemplate/exception-spec-crash.cpp [deleted file]

index 4ac00b2fed5c3a8362093d316b2e67816a1a18c2..f5a93d442ca952466b4dd2c39cdda3b976c025ad 100644 (file)
@@ -4789,7 +4789,7 @@ public:
   void CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD);
   void CheckExplicitlyDefaultedMemberExceptionSpec(CXXMethodDecl *MD,
                                                    const FunctionProtoType *T);
-  void CheckDelayedMemberExceptionSpecs();
+  void CheckDelayedExplicitlyDefaultedMemberExceptionSpecs();
 
   //===--------------------------------------------------------------------===//
   // C++ Derived Classes
index 31de6524a446638ce4d2d73d34d4169b129b9ffb..59648441a6d12c83e6b8c5372840782e712f1306 100644 (file)
@@ -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.
index 0355a981b2bb900e435b7fd37ffe787ee5ee5653..bd864b3adbc77bb4b2ac8ec72f59691a640cb9d8 100644 (file)
@@ -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 (file)
index 4d93559..0000000
+++ /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_;
-};