r192921 - Revert "Fix missed exception spec checks and crashes"
Alp Toker
alp at nuanti.com
Thu Oct 17 14:00:19 PDT 2013
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 at -2 {{does not match the calculated}}
-#else
-// expected-no-diagnostics
-#endif
- Foo &operator=(Foo &&) noexcept = default;
- basic_string<allocator<char> > vectorFoo_;
-};
More information about the cfe-commits
mailing list