[clang-tidy] Fix an assertion failure in cppcoreguidelines-pro-type-member-init.
authorHaojian Wu <hokein@google.com>
Thu, 20 Oct 2016 13:15:40 +0000 (13:15 +0000)
committerHaojian Wu <hokein@google.com>
Thu, 20 Oct 2016 13:15:40 +0000 (13:15 +0000)
Summary:
The matcher for matching "class with default constructor" still match
some classes without default constructor, which trigger an assert at
Line 307. This patch makes the matcher more strict.

Reviewers: aaron.ballman

Subscribers: nemanjai, cfe-commits

Differential Revision: https://reviews.llvm.org/D25747

llvm-svn: 284727

clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp

index 548f13f..272e2da 100644 (file)
@@ -27,6 +27,10 @@ namespace cppcoreguidelines {
 
 namespace {
 
+AST_MATCHER(CXXRecordDecl, hasDefaultConstructor) {
+  return Node.hasDefaultConstructor();
+}
+
 // Iterate over all the fields in a record type, both direct and indirect (e.g.
 // if the record contains an anonmyous struct). If OneFieldPerUnion is true and
 // the record type (or indirect field) is a union, forEachField will stop after
@@ -275,6 +279,7 @@ void ProTypeMemberInitCheck::registerMatchers(MatchFinder *Finder) {
   Finder->addMatcher(
       cxxRecordDecl(
           isDefinition(), unless(isInstantiated()),
+          hasDefaultConstructor(),
           anyOf(has(cxxConstructorDecl(isDefaultConstructor(), isDefaulted(),
                                        unless(isImplicit()))),
                 unless(has(cxxConstructorDecl()))),
index 4f0bde6..c287c5c 100644 (file)
@@ -450,3 +450,9 @@ struct NegativeIncompleteArrayMember {
   NegativeIncompleteArrayMember() {}
   char e[];
 };
+
+template <typename T> class NoCrash {
+  class B : public NoCrash {
+    template <typename U> B(U u) {}
+  };
+};