From 4ae537c2220f5064fdc914348dabe70eb10eef85 Mon Sep 17 00:00:00 2001 From: Weverything Date: Thu, 7 May 2020 18:47:19 -0700 Subject: [PATCH] Fix false positive with -Wnon-c-typedef-for-linkage Implicit methods for structs can confuse the warning, so exclude checking the Decl's that are implicit. Implicit Decl's for lambdas still need to be checked, so skipping all implicit Decl's won't work. Differential Revision: https://reviews.llvm.org/D79548 --- clang/lib/Sema/SemaDecl.cpp | 5 ++++- clang/test/SemaCXX/anonymous-struct.cpp | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 46e5419..5d3314b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -4425,8 +4425,11 @@ static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD) { 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 index 017c867..10f6711 100644 --- a/clang/test/SemaCXX/anonymous-struct.cpp +++ b/clang/test/SemaCXX/anonymous-struct.cpp @@ -133,3 +133,23 @@ namespace ValidButUnsupported { 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 -- 2.7.4