PiotrZSL created this revision.
PiotrZSL added reviewers: njames93, carlosgalvezp.
Herald added a subscriber: xazax.hun.
Herald added a project: All.
PiotrZSL requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Added support for C++17 or later in tests
Pointers to member functions are now handled correctly in C++20

Depends on D148458 <https://reviews.llvm.org/D148458>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D148461

Files:
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
  clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp


Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
@@ -1,10 +1,9 @@
-// RUN: %check_clang_tidy -std=c++11,c++14 %s bugprone-exception-escape %t -- \
+// RUN: %check_clang_tidy -std=c++11-or-later %s bugprone-exception-escape %t 
-- \
 // RUN:     -config="{CheckOptions: [ \
 // RUN:         {key: bugprone-exception-escape.IgnoredExceptions, value: 
'ignored1,ignored2'}, \
 // RUN:         {key: bugprone-exception-escape.FunctionsThatShouldNotThrow, 
value: 'enabled1,enabled2,enabled3'} \
 // RUN:     ]}" \
 // RUN:     -- -fexceptions
-// FIXME: Fix the checker to work in C++17 or later mode.
 
 struct throwing_destructor {
   ~throwing_destructor() {
@@ -412,7 +411,7 @@
   void throw_noexcept_catch_regular() noexcept {
     try {
       throw &foo;
-    } catch(int (*)()) {
+    } catch(int (*)() noexcept) {
     }
   }
 }
Index: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
===================================================================
--- clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -157,6 +157,9 @@
     return false;
 
   if (To->isFunctionPointerType()) {
+    // FIXME: Two function pointers can differ in 'noexcept', but they still
+    // should be considered to be same, now this triggers false-positive 
because
+    // Type* != Type*.
     if (From->isFunctionPointerType())
       return To->getPointeeType() == From->getPointeeType();
 
@@ -278,16 +281,17 @@
       return false;
 
     if (!isSameP_i(From, To)) {
-      if (LangOpts.CPlusPlus20) {
-        if (From->isConstantArrayType() && !To->isIncompleteArrayType())
-          return false;
+      if (!LangOpts.CPlusPlus20)
+        return false;
 
-        if (From->isIncompleteArrayType() && !To->isIncompleteArrayType())
-          return false;
+      if (From->isConstantArrayType() && !To->isIncompleteArrayType())
+        return false;
 
-      } else {
+      if (From->isIncompleteArrayType() && !To->isIncompleteArrayType())
+        return false;
+
+      if (From->isMemberPointerType() || To->isMemberPointerType())
         return false;
-      }
     }
 
     ++I;


Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape.cpp
@@ -1,10 +1,9 @@
-// RUN: %check_clang_tidy -std=c++11,c++14 %s bugprone-exception-escape %t -- \
+// RUN: %check_clang_tidy -std=c++11-or-later %s bugprone-exception-escape %t -- \
 // RUN:     -config="{CheckOptions: [ \
 // RUN:         {key: bugprone-exception-escape.IgnoredExceptions, value: 'ignored1,ignored2'}, \
 // RUN:         {key: bugprone-exception-escape.FunctionsThatShouldNotThrow, value: 'enabled1,enabled2,enabled3'} \
 // RUN:     ]}" \
 // RUN:     -- -fexceptions
-// FIXME: Fix the checker to work in C++17 or later mode.
 
 struct throwing_destructor {
   ~throwing_destructor() {
@@ -412,7 +411,7 @@
   void throw_noexcept_catch_regular() noexcept {
     try {
       throw &foo;
-    } catch(int (*)()) {
+    } catch(int (*)() noexcept) {
     }
   }
 }
Index: clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
===================================================================
--- clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -157,6 +157,9 @@
     return false;
 
   if (To->isFunctionPointerType()) {
+    // FIXME: Two function pointers can differ in 'noexcept', but they still
+    // should be considered to be same, now this triggers false-positive because
+    // Type* != Type*.
     if (From->isFunctionPointerType())
       return To->getPointeeType() == From->getPointeeType();
 
@@ -278,16 +281,17 @@
       return false;
 
     if (!isSameP_i(From, To)) {
-      if (LangOpts.CPlusPlus20) {
-        if (From->isConstantArrayType() && !To->isIncompleteArrayType())
-          return false;
+      if (!LangOpts.CPlusPlus20)
+        return false;
 
-        if (From->isIncompleteArrayType() && !To->isIncompleteArrayType())
-          return false;
+      if (From->isConstantArrayType() && !To->isIncompleteArrayType())
+        return false;
 
-      } else {
+      if (From->isIncompleteArrayType() && !To->isIncompleteArrayType())
+        return false;
+
+      if (From->isMemberPointerType() || To->isMemberPointerType())
         return false;
-      }
     }
 
     ++I;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to