Commit ef2662bf by Paolo Carlini Committed by Paolo Carlini

re PR c++/61080 (Spurious no return statement warning with deleted operators)

/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
parent 50f0aa20
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> 2014-05-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60999 PR c++/60999
......
...@@ -19542,6 +19542,7 @@ instantiate_decl (tree d, int defer_ok, ...@@ -19542,6 +19542,7 @@ instantiate_decl (tree d, int defer_ok,
int saved_unevaluated_operand = cp_unevaluated_operand; int saved_unevaluated_operand = cp_unevaluated_operand;
int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings; int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
bool external_p; bool external_p;
bool deleted_p;
tree fn_context; tree fn_context;
bool nested; bool nested;
...@@ -19623,11 +19624,17 @@ instantiate_decl (tree d, int defer_ok, ...@@ -19623,11 +19624,17 @@ instantiate_decl (tree d, int defer_ok,
args = gen_args; args = gen_args;
if (TREE_CODE (d) == FUNCTION_DECL) if (TREE_CODE (d) == FUNCTION_DECL)
pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE {
|| DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern) deleted_p = DECL_DELETED_FN (code_pattern);
|| DECL_DELETED_FN (code_pattern)); pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE
|| DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern)
|| deleted_p);
}
else 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. */ /* We may be in the middle of deferred access check. Disable it now. */
push_deferring_access_checks (dk_no_deferred); push_deferring_access_checks (dk_no_deferred);
...@@ -19671,7 +19678,10 @@ instantiate_decl (tree d, int defer_ok, ...@@ -19671,7 +19678,10 @@ instantiate_decl (tree d, int defer_ok,
elsewhere, we don't want to instantiate the entire data elsewhere, we don't want to instantiate the entire data
member, but we do want to instantiate the initializer so that member, but we do want to instantiate the initializer so that
we can substitute that elsewhere. */ 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 /* The definition of the static data member is now required so
we must substitute the initializer. */ we must substitute the initializer. */
...@@ -19867,17 +19877,14 @@ instantiate_decl (tree d, int defer_ok, ...@@ -19867,17 +19877,14 @@ instantiate_decl (tree d, int defer_ok,
tf_warning_or_error, tmpl, tf_warning_or_error, tmpl,
/*integral_constant_expression_p=*/false); /*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. */
/* Set the current input_location to the end of the function input_location
so that finish_function knows where we are. */ = DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus;
input_location
= DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus; /* Remember if we saw an infinite loop in the template. */
current_function_infinite_loop
/* Remember if we saw an infinite loop in the template. */ = DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
current_function_infinite_loop
= DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
}
} }
/* We don't need the local specializations any more. */ /* We don't need the local specializations any more. */
......
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> 2014-05-07 Richard Biener <rguenther@suse.de>
PR tree-optimization/61034 PR tree-optimization/61034
......
// 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*>;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment