[clang-tools-extra] r253598 - Test to ensure the function does not have an unresolved or unevaluated exception specification before testing whether the function throws or not. Fixes PR25574.
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 19 12:45:36 PST 2015
Author: aaronballman
Date: Thu Nov 19 14:45:35 2015
New Revision: 253598
URL: http://llvm.org/viewvc/llvm-project?rev=253598&view=rev
Log:
Test to ensure the function does not have an unresolved or unevaluated exception specification before testing whether the function throws or not. Fixes PR25574.
Modified:
clang-tools-extra/trunk/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
clang-tools-extra/trunk/test/clang-tidy/cert-throw-exception-type.cpp
Modified: clang-tools-extra/trunk/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/ThrownExceptionTypeCheck.cpp?rev=253598&r1=253597&r2=253598&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/cert/ThrownExceptionTypeCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/cert/ThrownExceptionTypeCheck.cpp Thu Nov 19 14:45:35 2015
@@ -19,9 +19,12 @@ AST_MATCHER(CXXConstructorDecl, isNoThro
if (!Node.isCopyConstructor())
return false;
- if (const auto *FnTy = Node.getType()->getAs<FunctionProtoType>())
- return FnTy->isNothrow(Node.getASTContext());
- llvm_unreachable("Copy constructor with no prototype");
+ const auto *FnTy = Node.getType()->getAs<FunctionProtoType>();
+ // Assume the best for any unresolved exception specification.
+ if (isUnresolvedExceptionSpec(FnTy->getExceptionSpecType()))
+ return true;
+
+ return FnTy->isNothrow(Node.getASTContext());
}
} // end namespace
@@ -36,7 +39,6 @@ void ThrownExceptionTypeCheck::registerM
isCopyConstructor(), unless(isNoThrowCopyConstructor()))))
.bind("expr"))),
this);
-
}
void ThrownExceptionTypeCheck::check(const MatchFinder::MatchResult &Result) {
Modified: clang-tools-extra/trunk/test/clang-tidy/cert-throw-exception-type.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/cert-throw-exception-type.cpp?rev=253598&r1=253597&r2=253598&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/cert-throw-exception-type.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/cert-throw-exception-type.cpp Thu Nov 19 14:45:35 2015
@@ -108,5 +108,20 @@ void f() {
throw Allocates(); // match, copy constructor throws
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: thrown exception type is not nothrow copy constructible
throw OptionallyAllocates(); // ok
+}
+
+namespace PR25574 {
+struct B {
+ B(const B&) noexcept;
+};
+struct D : B {
+ D();
+ virtual ~D() noexcept;
+};
+
+template <typename T>
+void f() {
+ throw D();
+}
}
More information about the cfe-commits
mailing list