rtrieu created this revision. rtrieu added a reviewer: rsmith. Herald added a project: clang.
Fix false positives for -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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D79548 Files: clang/lib/Sema/SemaDecl.cpp clang/test/SemaCXX/anonymous-struct.cpp Index: clang/test/SemaCXX/anonymous-struct.cpp =================================================================== --- clang/test/SemaCXX/anonymous-struct.cpp +++ clang/test/SemaCXX/anonymous-struct.cpp @@ -133,3 +133,20 @@ int arr[&f<X> ? 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; +} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -4425,8 +4425,11 @@ isa<EnumDecl>(D)) continue; auto *MemberRD = dyn_cast<CXXRecordDecl>(D); - if (!MemberRD) + if (!MemberRD) { + if (D->isImplicit()) + continue; return {NonCLikeKind::OtherMember, D->getSourceRange()}; + } // -- contain a lambda-expression, if (MemberRD->isLambda())
Index: clang/test/SemaCXX/anonymous-struct.cpp =================================================================== --- clang/test/SemaCXX/anonymous-struct.cpp +++ clang/test/SemaCXX/anonymous-struct.cpp @@ -133,3 +133,20 @@ int arr[&f<X> ? 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; +} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -4425,8 +4425,11 @@ isa<EnumDecl>(D)) continue; auto *MemberRD = dyn_cast<CXXRecordDecl>(D); - if (!MemberRD) + if (!MemberRD) { + if (D->isImplicit()) + continue; return {NonCLikeKind::OtherMember, D->getSourceRange()}; + } // -- contain a lambda-expression, if (MemberRD->isLambda())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits