re PR c++/61080 (Spurious no return statement warning with deleted operators)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 7 May 2014 14:30:23 +0000 (14:30 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 7 May 2014 14:30:23 +0000 (14:30 +0000)
/cp
2014-05-07  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/61080
* pt.c (instantiate_decl): Avoid generating the body of a
deleted function.

/testsuite
2014-05-07  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/61080
* g++.dg/cpp0x/deleted7.C: New.

From-SVN: r210161

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/deleted7.C [new file with mode: 0644]

index d3eb4f2..938fbf5 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/61080
+       * pt.c (instantiate_decl): Avoid generating the body of a
+       deleted function.
+
 2014-05-06  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/60999
index d9e273e..f23eec3 100644 (file)
@@ -19542,6 +19542,7 @@ instantiate_decl (tree d, int defer_ok,
   int saved_unevaluated_operand = cp_unevaluated_operand;
   int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
   bool external_p;
+  bool deleted_p;
   tree fn_context;
   bool nested;
 
@@ -19623,11 +19624,17 @@ instantiate_decl (tree d, int defer_ok,
     args = gen_args;
 
   if (TREE_CODE (d) == FUNCTION_DECL)
-    pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE
-                      || DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern)
-                      || DECL_DELETED_FN (code_pattern));
+    {
+      deleted_p = DECL_DELETED_FN (code_pattern);
+      pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE
+                        || DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern)
+                        || deleted_p);
+    }
   else
-    pattern_defined = ! DECL_IN_AGGR_P (code_pattern);
+    {
+      deleted_p = false;
+      pattern_defined = ! DECL_IN_AGGR_P (code_pattern);
+    }
 
   /* We may be in the middle of deferred access check.  Disable it now.  */
   push_deferring_access_checks (dk_no_deferred);
@@ -19671,7 +19678,10 @@ instantiate_decl (tree d, int defer_ok,
         elsewhere, we don't want to instantiate the entire data
         member, but we do want to instantiate the initializer so that
         we can substitute that elsewhere.  */
-      || (external_p && VAR_P (d)))
+      || (external_p && VAR_P (d))
+      /* Handle here a deleted function too, avoid generating
+        its body (c++/61080).  */
+      || deleted_p)
     {
       /* The definition of the static data member is now required so
         we must substitute the initializer.  */
@@ -19867,17 +19877,14 @@ instantiate_decl (tree d, int defer_ok,
                       tf_warning_or_error, tmpl,
                       /*integral_constant_expression_p=*/false);
 
-         if (DECL_STRUCT_FUNCTION (code_pattern))
-           {
-             /* Set the current input_location to the end of the function
-                so that finish_function knows where we are.  */
-             input_location
-               = DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus;
-
-             /* Remember if we saw an infinite loop in the template.  */
-             current_function_infinite_loop
-               = DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
-           }
+         /* Set the current input_location to the end of the function
+            so that finish_function knows where we are.  */
+         input_location
+           = DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus;
+
+         /* Remember if we saw an infinite loop in the template.  */
+         current_function_infinite_loop
+           = DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
        }
 
       /* We don't need the local specializations any more.  */
index 723967f..97ce690 100644 (file)
@@ -1,3 +1,8 @@
+2014-05-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/61080
+       * g++.dg/cpp0x/deleted7.C: New.
+
 2014-05-07  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/61034
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted7.C b/gcc/testsuite/g++.dg/cpp0x/deleted7.C
new file mode 100644 (file)
index 0000000..6afa9f7
--- /dev/null
@@ -0,0 +1,36 @@
+// PR c++/61080
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wreturn-type" }
+
+struct AAA
+{
+  int a1, a2, a3;
+  void *p;
+};
+
+template <typename K, typename V>
+class WeakMapPtr
+{
+  public:
+    WeakMapPtr() : ptr(nullptr) {};
+    bool init(AAA *cx);
+  private:
+    void *ptr;
+    WeakMapPtr(const WeakMapPtr &wmp) = delete;
+    WeakMapPtr &operator=(const WeakMapPtr &wmp) = delete;
+};
+
+template <typename K, typename V>
+bool WeakMapPtr<K, V>::init(AAA *cx)
+{
+    ptr = cx->p;
+    return true;
+}
+
+struct JSObject
+{
+  int blah;
+  float meh;
+};
+
+template class WeakMapPtr<JSObject*, JSObject*>;