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
This commit is contained in:
parent
50f0aa2074
commit
ef2662bf65
@ -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
|
||||
|
37
gcc/cp/pt.c
37
gcc/cp/pt.c
@ -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. */
|
||||
|
@ -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
|
||||
|
36
gcc/testsuite/g++.dg/cpp0x/deleted7.C
Normal file
36
gcc/testsuite/g++.dg/cpp0x/deleted7.C
Normal file
@ -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*>;
|
Loading…
Reference in New Issue
Block a user