We've been warning about a base with different visibility while
walking the fields list as well as the base list.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit de7f9f640df9dc1e181284009ba48ac281bef825
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri Nov 17 17:13:40 2017 -0500

    Avoid duplicate visibility warning.
    
            * decl2.c (constrain_class_visibility): Don't warn about artificial
            fields.

diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index bc0db0000de..13e7b1d180a 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2553,7 +2553,8 @@ constrain_class_visibility (tree type)
     vis = VISIBILITY_INTERNAL;
 
   for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t))
-    if (TREE_CODE (t) == FIELD_DECL && TREE_TYPE (t) != error_mark_node)
+    if (TREE_CODE (t) == FIELD_DECL && TREE_TYPE (t) != error_mark_node
+       && !DECL_ARTIFICIAL (t))
       {
        tree ftype = strip_pointer_or_array_types (TREE_TYPE (t));
        int subvis = type_visibility (ftype);
diff --git a/gcc/testsuite/g++.dg/ext/visibility/warn6.C 
b/gcc/testsuite/g++.dg/ext/visibility/warn6.C
new file mode 100644
index 00000000000..256ebd2ad2f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/visibility/warn6.C
@@ -0,0 +1,2 @@
+struct __attribute ((visibility ("hidden"))) A { int i; };
+struct B: A { }; // { dg-warning "base" }

Reply via email to