aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-05-20 08:28:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-05-20 08:28:49 -0400
commit8f1352c4190e174c76f3a7b264411b3374f87450 (patch)
treea8d79e21410917cadd0cdc2e55850b594da2b140
parenta293ed6ec64c9a5364c72fc96e08e345d0104822 (diff)
downloadgcc-8f1352c4190e174c76f3a7b264411b3374f87450.zip
gcc-8f1352c4190e174c76f3a7b264411b3374f87450.tar.gz
gcc-8f1352c4190e174c76f3a7b264411b3374f87450.tar.bz2
re PR c++/57317 (bogus and unsuppressible warning: 'YYY' has a base 'ZZZ' whose type uses the anonymous namespace)
PR c++/57317 * decl2.c (determine_visibility): Use PRIMARY_TEMPLATE_P to decide whether a template has its own args. From-SVN: r199101
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c5
-rw-r--r--gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C12
-rw-r--r--gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h14
4 files changed, 33 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9d8ad50..0fee1b5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/57317
+ * decl2.c (determine_visibility): Use PRIMARY_TEMPLATE_P to decide
+ whether a template has its own args.
+
2013-05-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57327
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 8d2385d..358a26f 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2210,9 +2210,6 @@ determine_visibility (tree decl)
&& !lookup_attribute ("visibility", attribs))
{
int depth = TMPL_ARGS_DEPTH (args);
- int class_depth = 0;
- if (class_type && CLASSTYPE_TEMPLATE_INFO (class_type))
- class_depth = TMPL_ARGS_DEPTH (CLASSTYPE_TI_ARGS (class_type));
if (DECL_VISIBILITY_SPECIFIED (decl))
{
/* A class template member with explicit visibility
@@ -2225,7 +2222,7 @@ determine_visibility (tree decl)
constrain_visibility_for_template (decl, lev);
}
}
- else if (depth > class_depth)
+ else if (PRIMARY_TEMPLATE_P (TI_TEMPLATE (tinfo)))
/* Limit visibility based on its template arguments. */
constrain_visibility_for_template (decl, args);
}
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C
new file mode 100644
index 0000000..7d1e89e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C
@@ -0,0 +1,12 @@
+// PR c++/57137
+
+#include "anonymous-namespace-4.h"
+
+namespace
+{
+ class NonCloneable;
+ void fn1 ()
+ {
+ is_function_impl < NonCloneable > i;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h
new file mode 100644
index 0000000..e0b7d68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h
@@ -0,0 +1,14 @@
+template < typename T > struct integral_c {
+ static const T value = 0;
+};
+struct is_reference:integral_c < bool > { };
+template < class > struct is_function_ptr_helper { };
+template < bool > struct is_function_chooser;
+
+template <> struct is_function_chooser <0 >
+{
+ template < typename T > struct result_:is_function_ptr_helper < T * > { };
+};
+
+template < typename T > struct is_function_impl:is_function_chooser <
+ is_reference::value >::result_ < T > { };