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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits