diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -4425,8 +4425,11 @@ isa(D)) continue; auto *MemberRD = dyn_cast(D); - if (!MemberRD) + if (!MemberRD) { + if (D->isImplicit()) + continue; return {NonCLikeKind::OtherMember, D->getSourceRange()}; + } // -- contain a lambda-expression, if (MemberRD->isLambda()) diff --git a/clang/test/SemaCXX/anonymous-struct.cpp b/clang/test/SemaCXX/anonymous-struct.cpp --- a/clang/test/SemaCXX/anonymous-struct.cpp +++ b/clang/test/SemaCXX/anonymous-struct.cpp @@ -133,3 +133,23 @@ int arr[&f ? 1 : 2]; } C; // expected-note {{by this typedef}} } + +namespace ImplicitDecls { +struct Destructor { + ~Destructor() {} +}; +typedef struct { +} Empty; + +typedef struct { + Destructor x; +} A; + +typedef struct { + Empty E; +} B; + +typedef struct { + const Empty E; +} C; +} // namespace ImplicitDecls