Author: aaronballman
Date: Wed Nov 28 07:04:38 2018
New Revision: 347761

URL: http://llvm.org/viewvc/llvm-project?rev=347761&view=rev
Log:
Fix false positive with lambda assignments in cert-err58-cpp.

This check is about preventing exceptions from being thrown before main() 
executes, and assigning a lambda (rather than calling it) to a global object 
cannot throw any exceptions.

Modified:
    clang-tools-extra/trunk/clang-tidy/cert/StaticObjectExceptionCheck.cpp
    clang-tools-extra/trunk/test/clang-tidy/cert-static-object-exception.cpp

Modified: clang-tools-extra/trunk/clang-tidy/cert/StaticObjectExceptionCheck.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cert/StaticObjectExceptionCheck.cpp?rev=347761&r1=347760&r2=347761&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/cert/StaticObjectExceptionCheck.cpp 
(original)
+++ clang-tools-extra/trunk/clang-tidy/cert/StaticObjectExceptionCheck.cpp Wed 
Nov 28 07:04:38 2018
@@ -26,7 +26,8 @@ void StaticObjectExceptionCheck::registe
   // initializer that can throw.
   Finder->addMatcher(
       varDecl(anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()),
-              unless(anyOf(isConstexpr(), hasAncestor(functionDecl()))),
+              unless(anyOf(isConstexpr(), hasType(cxxRecordDecl(isLambda())),
+                           hasAncestor(functionDecl()))),
               anyOf(hasDescendant(cxxConstructExpr(hasDeclaration(
                         
cxxConstructorDecl(unless(isNoThrow())).bind("func")))),
                     hasDescendant(cxxNewExpr(hasDeclaration(

Modified: 
clang-tools-extra/trunk/test/clang-tidy/cert-static-object-exception.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/cert-static-object-exception.cpp?rev=347761&r1=347760&r2=347761&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/cert-static-object-exception.cpp 
(original)
+++ clang-tools-extra/trunk/test/clang-tidy/cert-static-object-exception.cpp 
Wed Nov 28 07:04:38 2018
@@ -1,7 +1,7 @@
-// RUN: clang-tidy %s -checks="-*,cert-err58-cpp" -- -std=c++11 -target 
x86_64-pc-linux-gnu \
+// RUN: clang-tidy %s -checks="-*,cert-err58-cpp" -- -std=c++17 -target 
x86_64-pc-linux-gnu \
 // RUN:   | FileCheck %s -check-prefix=CHECK-EXCEPTIONS \
 // RUN:   -implicit-check-not="{{warning|error}}:"
-// RUN: clang-tidy %s -checks="-*,cert-err58-cpp" -- -DNONEXCEPTIONS 
-fno-exceptions -std=c++11 -target x86_64-pc-linux-gnu \
+// RUN: clang-tidy %s -checks="-*,cert-err58-cpp" -- -DNONEXCEPTIONS 
-fno-exceptions -std=c++17 -target x86_64-pc-linux-gnu \
 // RUN:   | FileCheck %s -allow-empty -check-prefix=CHECK-NONEXCEPTIONS \
 // RUN:   -implicit-check-not="{{warning|error}}:"
 
@@ -236,3 +236,28 @@ int baz = foo(0); // Not OK; throws at r
 } // namespace pr35457
 #endif // NONEXCEPTIONS
 
+namespace pr39777 {
+struct S { S(); };
+struct T { T() noexcept; };
+
+auto Okay1 = []{ S s; };
+auto Okay2 = []{ (void)new int; };
+auto NotOkay1 = []{ S s; return 12; }(); // Because the lambda call is not 
noexcept
+// CHECK-EXCEPTIONS: :[[@LINE-1]]:6: warning: initialization of 'NotOkay1' 
with static storage duration may throw an exception that cannot be caught 
[cert-err58-cpp]
+// CHECK-EXCEPTIONS: :[[@LINE-7]]:12: note: possibly throwing constructor 
declared here
+auto NotOkay2 = []() noexcept { S s; return 12; }(); // Because S::S() is not 
noexcept
+// CHECK-EXCEPTIONS: :[[@LINE-1]]:6: warning: initialization of 'NotOkay2' 
with static storage duration may throw an exception that cannot be caught 
[cert-err58-cpp]
+// CHECK-EXCEPTIONS: :[[@LINE-10]]:12: note: possibly throwing constructor 
declared here
+auto Okay3 = []() noexcept { T t; return t; }();
+
+struct U {
+  U() noexcept;
+  auto getBadLambda() const noexcept {
+    return []{ S s; return s; };
+  }
+};
+auto Okay4 = []{ U u; return u.getBadLambda(); }();
+auto NotOkay3 = []() noexcept { U u; return u.getBadLambda(); }()(); // 
Because the lambda returned and called is not noexcept
+// CHECK-EXCEPTIONS: :[[@LINE-1]]:6: warning: initialization of 'NotOkay3' 
with static storage duration may throw an exception that cannot be caught 
[cert-err58-cpp]
+// CHECK-EXCEPTIONS: :[[@LINE-6]]:12: note: possibly throwing function 
declared here
+}


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to