diff --git a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp b/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp --- a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp +++ b/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()) diff --git a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init-no-crash.cpp new file mode 100644 --- /dev/null +++ b/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