diff mbox

[C++] PR 61080

Message ID 5369F5BD.6030804@oracle.com
State New
Headers show

Commit Message

Paolo Carlini May 7, 2014, 8:58 a.m. UTC
Hi,

thus I prepared this simple patch. Tested x86_64-linux.

Thanks,
Paolo.

/////////////////////
/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.

Comments

Jason Merrill May 7, 2014, 2:09 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

Index: cp/pt.c
===================================================================
--- cp/pt.c	(revision 210140)
+++ cp/pt.c	(working copy)
@@ -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;
+	  /* 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;
-	    }
+	  /* 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: testsuite/g++.dg/cpp0x/deleted7.C
===================================================================
--- testsuite/g++.dg/cpp0x/deleted7.C	(revision 0)
+++ testsuite/g++.dg/cpp0x/deleted7.C	(working copy)
@@ -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*>;