re PR c++/56130 (__attribute__((deprecated)) does not affect C++ reference)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 21 Aug 2013 19:06:05 +0000 (19:06 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 21 Aug 2013 19:06:05 +0000 (19:06 +0000)
2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>

* call.c (build_new_method_call_1): Use INDIRECT_REF_P.
* cp-tree.h (REFERENCE_REF_P): Likewise.
* semantics.c (finish_offsetof): Likewise.

/cp
2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/56130
* semantics.c (finish_id_expression): Handle deprecated references.

/testsuite
2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/56130
* g++.dg/warn/deprecated-7.C: New.

From-SVN: r201906

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/deprecated-7.C [new file with mode: 0644]

index c18bcb522634182b82f86475b95132e79db2ea75..c99f9483f0c119b9cf8d8409bcb6de46c51a907d 100644 (file)
@@ -1,3 +1,14 @@
+2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * call.c (build_new_method_call_1): Use INDIRECT_REF_P.
+       * cp-tree.h (REFERENCE_REF_P): Likewise.
+       * semantics.c (finish_offsetof): Likewise.
+
+2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/56130
+       * semantics.c (finish_id_expression): Handle deprecated references.
+
 2013-08-20  Jason Merrill  <jason@redhat.com>
 
        PR c++/58119
index df87d8f4d8d698d632a07ab9b40f1bd2e0791b1c..f8fab0828132bc680a4c1b5c37cc8b6d9202be59 100644 (file)
@@ -7668,7 +7668,7 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
 
       if (init)
        {
-         if (TREE_CODE (instance) == INDIRECT_REF
+         if (INDIRECT_REF_P (instance)
              && integer_zerop (TREE_OPERAND (instance, 0)))
            return get_target_expr_sfinae (init, complain);
          init = build2 (INIT_EXPR, TREE_TYPE (instance), instance, init);
index 51dab8aa4f34aafc85b63aaf5b43f1ed60a5197d..3c5201f38fb5d4168ad80935615b45b1222aa292 100644 (file)
@@ -2975,7 +2975,7 @@ extern void decl_shadowed_for_var_insert (tree, tree);
 
 /* True if NODE is an implicit INDIRECT_EXPR from convert_from_reference.  */
 #define REFERENCE_REF_P(NODE)                          \
-  (TREE_CODE (NODE) == INDIRECT_REF                    \
+  (INDIRECT_REF_P (NODE)                               \
    && TREE_TYPE (TREE_OPERAND (NODE, 0))               \
    && (TREE_CODE (TREE_TYPE (TREE_OPERAND ((NODE), 0)))        \
        == REFERENCE_TYPE))
index fa47db7cac7bfa66a01bd123a3114e28f4e5c4cf..ee3503cdd772f9a9d6a5dc808cfb779875334d2a 100644 (file)
@@ -3457,8 +3457,10 @@ finish_id_expression (tree id_expression,
        }
     }
 
-  if (TREE_DEPRECATED (decl))
-    warn_deprecated_use (decl, NULL_TREE);
+  /* Handle references (c++/56130).  */
+  tree t = REFERENCE_REF_P (decl) ? TREE_OPERAND (decl, 0) : decl;
+  if (TREE_DEPRECATED (t))
+    warn_deprecated_use (t, NULL_TREE);
 
   return decl;
 }
@@ -3691,7 +3693,7 @@ finish_offsetof (tree expr)
       || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
       || TREE_TYPE (expr) == unknown_type_node)
     {
-      if (TREE_CODE (expr) == INDIRECT_REF)
+      if (INDIRECT_REF_P (expr))
        error ("second operand of %<offsetof%> is neither a single "
               "identifier nor a sequence of member accesses and "
               "array references");
index f5f3326399aa25256311d4583f89a6a69c499d5e..e117f84ee7ec6544efe6f2fcb4e1ec7799510ef7 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/56130
+       * g++.dg/warn/deprecated-7.C: New.
+
 2013-08-21  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/tree-prof/pr57451.C: Remove spurious dg-do directive.
diff --git a/gcc/testsuite/g++.dg/warn/deprecated-7.C b/gcc/testsuite/g++.dg/warn/deprecated-7.C
new file mode 100644 (file)
index 0000000..f564a1b
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/56130
+
+int g_nn;
+int& g_n __attribute__((deprecated)) = g_nn;
+
+void f()
+{
+  int f_nn;
+  int& f_n __attribute__((deprecated)) = f_nn;
+  f_n = 1;    // { dg-warning "'f_n' is deprecated" }
+}
+
+int main()
+{
+  g_n = 1;    // { dg-warning "'g_n' is deprecated" }
+  f();
+}