[clang-tools-extra] r259668 - [clang-tidy] Fix a crash issue on misc-virtual-near-miss check.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 3 09:21:44 PST 2016


Author: hokein
Date: Wed Feb  3 11:21:44 2016
New Revision: 259668

URL: http://llvm.org/viewvc/llvm-project?rev=259668&view=rev
Log:
[clang-tidy] Fix a crash issue on misc-virtual-near-miss check.

Summary:
The crash is caused by triggering a Assertion failed in DeclCXX.h when the
check detects non-defined class return type in a class method declaration.

Reviewers: congliu, alexfh

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D16854

Modified:
    clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp
    clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp

Modified: clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp?rev=259668&r1=259667&r2=259668&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/VirtualNearMissCheck.cpp Wed Feb  3 11:21:44 2016
@@ -72,6 +72,9 @@ static bool checkOverridingFunctionRetur
   if (DRD == nullptr || BRD == nullptr)
     return false;
 
+  if (!DRD->hasDefinition() || !BRD->hasDefinition())
+    return false;
+
   if (DRD == BRD)
     return true;
 

Modified: clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp?rev=259668&r1=259667&r2=259668&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/misc-virtual-near-miss.cpp Wed Feb  3 11:21:44 2016
@@ -1,10 +1,14 @@
 // RUN: %check_clang_tidy %s misc-virtual-near-miss %t
 
+class NoDefinedClass1;
+class NoDefinedClass2;
+
 struct Base {
   virtual void func();
   virtual void gunk();
   virtual ~Base();
   virtual Base &operator=(const Base &);
+  virtual NoDefinedClass1 *f();
 };
 
 struct Derived : Base {
@@ -24,6 +28,8 @@ struct Derived : Base {
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::fun' has {{.*}} 'Base::func'
 
   Derived &operator==(const Base &); // Should not warn: operators are ignored.
+
+  virtual NoDefinedClass2 *f1(); // Should not crash: non-defined class return type is ignored.
 };
 
 typedef Derived derived_type;




More information about the cfe-commits mailing list