Fix false positive with -Wnon-c-typedef-for-linkage
authorWeverything <rtrieu@google.com>
Fri, 8 May 2020 01:47:19 +0000 (18:47 -0700)
committerWeverything <rtrieu@google.com>
Fri, 8 May 2020 02:20:08 +0000 (19:20 -0700)
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
clang/test/SemaCXX/anonymous-struct.cpp

index 46e5419..5d3314b 100644 (file)
@@ -4425,8 +4425,11 @@ static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD) {
         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 017c867..10f6711 100644 (file)
@@ -133,3 +133,23 @@ namespace ValidButUnsupported {
     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;
+} // namespace ImplicitDecls