diff options
author | Jason Merrill <jason@redhat.com> | 2013-05-20 08:28:49 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-05-20 08:28:49 -0400 |
commit | 8f1352c4190e174c76f3a7b264411b3374f87450 (patch) | |
tree | a8d79e21410917cadd0cdc2e55850b594da2b140 | |
parent | a293ed6ec64c9a5364c72fc96e08e345d0104822 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/anonymous-namespace-4.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/anonymous-namespace-4.h | 14 |
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 > { }; |