summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/call.c7
-rw-r--r--gcc/cp/decl2.c19
-rw-r--r--gcc/cp/parser.c12
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-deprecated-1.C15
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/include/backward/binders.h6
-rw-r--r--libstdc++-v3/include/ext/array_allocator.h6
8 files changed, 68 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 05ca4931910..6e7f657c6ee 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,14 @@
2014-11-17 Jason Merrill <jason@redhat.com>
+ PR c++/33911
+ * call.c (build_call_a): Don't warn_deprecated_use here.
+ (build_over_call): Or here.
+ * decl2.c (mark_used): Do it here.
+ (is_late_template_attribute): Attribute deprecated is not deferred.
+ (cplus_decl_attributes): Propagate TREE_DEPRECATED out to the template.
+ * parser.c (cp_parser_template_name): Warn about deprecated template.
+ (cp_parser_template_argument): Likewise.
+
PR c++/50473
* decl.c (cp_finish_decl): Don't try to process a non-dependent
constant initializer for a reference.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 06162aa6286..c180890b965 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -387,8 +387,6 @@ build_call_a (tree function, int n, tree *argarray)
mark_used (decl);
}
- if (decl && TREE_DEPRECATED (decl))
- warn_deprecated_use (decl, NULL_TREE);
require_complete_eh_spec_types (fntype, decl);
TREE_HAS_CONSTRUCTOR (function) = (decl && DECL_CONSTRUCTOR_P (decl));
@@ -7447,11 +7445,6 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
ba_any, NULL, complain);
gcc_assert (binfo && binfo != error_mark_node);
- /* Warn about deprecated virtual functions now, since we're about
- to throw away the decl. */
- if (TREE_DEPRECATED (fn))
- warn_deprecated_use (fn, NULL_TREE);
-
argarray[0] = build_base_path (PLUS_EXPR, argarray[0], binfo, 1,
complain);
if (TREE_SIDE_EFFECTS (argarray[0]))
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index fb8d0c82e40..f3b94a93dc5 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1204,9 +1204,9 @@ is_late_template_attribute (tree attr, tree decl)
/* Also defer most attributes on dependent types. This is not
necessary in all cases, but is the better default. */
else if (dependent_type_p (type)
- /* But attributes abi_tag and visibility specifically apply
- to templates. */
+ /* But some attributes specifically apply to templates. */
&& !is_attribute_p ("abi_tag", name)
+ && !is_attribute_p ("deprecated", name)
&& !is_attribute_p ("visibility", name))
return true;
else
@@ -1482,6 +1482,17 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
if (TREE_CODE (*decl) == TYPE_DECL)
SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl));
+
+ /* Propagate deprecation out to the template. */
+ if (TREE_DEPRECATED (*decl))
+ if (tree ti = get_template_info (*decl))
+ {
+ tree tmpl = TI_TEMPLATE (ti);
+ tree pattern = (TYPE_P (*decl) ? TREE_TYPE (tmpl)
+ : DECL_TEMPLATE_RESULT (tmpl));
+ if (*decl == pattern)
+ TREE_DEPRECATED (tmpl) = true;
+ }
}
/* Walks through the namespace- or function-scope anonymous union
@@ -4891,6 +4902,10 @@ mark_used (tree decl, tsubst_flags_t complain)
return false;
}
+ if (TREE_DEPRECATED (decl) && (complain & tf_warning)
+ && deprecated_state != DEPRECATED_SUPPRESS)
+ warn_deprecated_use (decl, NULL_TREE);
+
/* We can only check DECL_ODR_USED on variables or functions with
DECL_LANG_SPECIFIC set, and these are also the only decls that we
might need special handling for. */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 3eff5fad862..b106f3b03cd 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -13959,7 +13959,11 @@ cp_parser_template_name (cp_parser* parser,
/* If DECL is a template, then the name was a template-name. */
if (TREE_CODE (decl) == TEMPLATE_DECL)
- ;
+ {
+ if (TREE_DEPRECATED (decl)
+ && deprecated_state != DEPRECATED_SUPPRESS)
+ warn_deprecated_use (decl, NULL_TREE);
+ }
else
{
tree fn = NULL_TREE;
@@ -14193,7 +14197,11 @@ cp_parser_template_argument (cp_parser* parser)
cp_parser_error (parser, "expected template-name");
}
if (cp_parser_parse_definitely (parser))
- return argument;
+ {
+ if (TREE_DEPRECATED (argument))
+ warn_deprecated_use (argument, NULL_TREE);
+ return argument;
+ }
/* It must be a non-type argument. There permitted cases are given
in [temp.arg.nontype]:
diff --git a/gcc/testsuite/g++.dg/ext/attr-deprecated-1.C b/gcc/testsuite/g++.dg/ext/attr-deprecated-1.C
new file mode 100644
index 00000000000..31a76903cb5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-deprecated-1.C
@@ -0,0 +1,15 @@
+// PR c++/33911
+
+template<typename T> struct __attribute__ ((deprecated)) S {};
+S<int> s; // { dg-warning "deprecated" }
+
+template <template <class> class T> struct A { };
+A<S> a; // { dg-warning "deprecated" }
+
+template <class T> void f() __attribute__ ((deprecated));
+
+int main()
+{
+ f<int>(); // { dg-warning "deprecated" }
+ void (*p)() = f<char>; // { dg-warning "deprecated" }
+}
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c6f32e423d5..857c05e163e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-17 Jason Merrill <jason@redhat.com>
+
+ * include/backward/binders.h: Suppress -Wdeprecated-declarations.
+ * include/ext/array_allocator.h: Likewise.
+
2014-11-14 Joel Sherrill <joel.sherrill@oarcorp.com>
* src/c++98/mt_allocator.cc: Fix assumption that sizeof(void *) is
diff --git a/libstdc++-v3/include/backward/binders.h b/libstdc++-v3/include/backward/binders.h
index bda52ed237b..70f8f212c5e 100644
--- a/libstdc++-v3/include/backward/binders.h
+++ b/libstdc++-v3/include/backward/binders.h
@@ -56,6 +56,10 @@
#ifndef _BACKWARD_BINDERS_H
#define _BACKWARD_BINDERS_H 1
+// Suppress deprecated warning for this file.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -173,4 +177,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
+#pragma GCC diagnostic pop
+
#endif /* _BACKWARD_BINDERS_H */
diff --git a/libstdc++-v3/include/ext/array_allocator.h b/libstdc++-v3/include/ext/array_allocator.h
index f807495a9e0..58cf35fc002 100644
--- a/libstdc++-v3/include/ext/array_allocator.h
+++ b/libstdc++-v3/include/ext/array_allocator.h
@@ -38,6 +38,10 @@
#include <type_traits>
#endif
+// Suppress deprecated warning for this file.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -171,4 +175,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
+#pragma GCC diagnostic pop
+
#endif