hokein created this revision. hokein added a reviewer: gribozavr. Herald added subscribers: kbarton, xazax.hun, nemanjai. Herald added a project: clang.
The recordIsTriviallyDefaultConstructible may cause an infinite loop when running on an ill-formed decl. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D66874 Files: clang-tools-extra/clang-tidy/utils/TypeTraits.cpp clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp Index: clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp @@ -0,0 +1,7 @@ +// RUN: %check_clang_tidy -expect-clang-tidy-error %s cppcoreguidelines-pro-type-member-init %t + +struct X { + X x; + // CHECK-MESSAGES: :[[@LINE-1]]:5: error: field has incomplete type 'X' [clang-diagnostic-error] + int a = 10; +}; \ No newline at end of file Index: clang-tools-extra/clang-tidy/utils/TypeTraits.cpp =================================================================== --- clang-tools-extra/clang-tidy/utils/TypeTraits.cpp +++ clang-tools-extra/clang-tidy/utils/TypeTraits.cpp @@ -54,6 +54,11 @@ // Non-C++ records are always trivially constructible. if (!ClassDecl) return true; + // Don't perform the check on an ill-formed Decl. As we will visit every class + // member recursively, an ill-formed Decl may cause an infinite loop during + // the runtime. + if (RecordDecl.isInvalidDecl()) + return false; // A class with a user-provided default constructor is not trivially // constructible. if (ClassDecl->hasUserProvidedDefaultConstructor())
Index: clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp @@ -0,0 +1,7 @@ +// RUN: %check_clang_tidy -expect-clang-tidy-error %s cppcoreguidelines-pro-type-member-init %t + +struct X { + X x; + // CHECK-MESSAGES: :[[@LINE-1]]:5: error: field has incomplete type 'X' [clang-diagnostic-error] + int a = 10; +}; \ No newline at end of file Index: clang-tools-extra/clang-tidy/utils/TypeTraits.cpp =================================================================== --- clang-tools-extra/clang-tidy/utils/TypeTraits.cpp +++ clang-tools-extra/clang-tidy/utils/TypeTraits.cpp @@ -54,6 +54,11 @@ // Non-C++ records are always trivially constructible. if (!ClassDecl) return true; + // Don't perform the check on an ill-formed Decl. As we will visit every class + // member recursively, an ill-formed Decl may cause an infinite loop during + // the runtime. + if (RecordDecl.isInvalidDecl()) + return false; // A class with a user-provided default constructor is not trivially // constructible. if (ClassDecl->hasUserProvidedDefaultConstructor())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits