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,20 @@ 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; +}