re PR c++/60389 ([c++11] ICE with inheriting constructors and wrong usage of constexpr)
/cp 2014-03-11 Paolo Carlini <paolo.carlini@oracle.com> PR c++/60389 * method.c (get_inherited_ctor): New. * cp-tree.h (get_inherited_ctor): Declare it. * semantics.c (is_valid_constexpr_fn): Use it. /testsuite 2014-03-11 Paolo Carlini <paolo.carlini@oracle.com> PR c++/60389 * g++.dg/cpp0x/inh-ctor19.C: New. From-SVN: r208491
This commit is contained in:
parent
06dce00742
commit
5af1876c65
6 changed files with 68 additions and 10 deletions
|
@ -1,3 +1,10 @@
|
|||
2014-03-11 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/60389
|
||||
* method.c (get_inherited_ctor): New.
|
||||
* cp-tree.h (get_inherited_ctor): Declare it.
|
||||
* semantics.c (is_valid_constexpr_fn): Use it.
|
||||
|
||||
2014-03-10 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/60367
|
||||
|
|
|
@ -5476,6 +5476,7 @@ extern tree get_copy_ctor (tree, tsubst_flags_t);
|
|||
extern tree get_copy_assign (tree);
|
||||
extern tree get_default_ctor (tree);
|
||||
extern tree get_dtor (tree, tsubst_flags_t);
|
||||
extern tree get_inherited_ctor (tree);
|
||||
extern tree locate_ctor (tree);
|
||||
extern tree implicitly_declare_fn (special_function_kind, tree,
|
||||
bool, tree, tree);
|
||||
|
|
|
@ -971,6 +971,25 @@ get_copy_assign (tree type)
|
|||
return fn;
|
||||
}
|
||||
|
||||
/* Locate the inherited constructor of constructor CTOR. */
|
||||
|
||||
tree
|
||||
get_inherited_ctor (tree ctor)
|
||||
{
|
||||
gcc_assert (DECL_INHERITED_CTOR_BASE (ctor));
|
||||
|
||||
push_deferring_access_checks (dk_no_check);
|
||||
tree fn = locate_fn_flags (DECL_INHERITED_CTOR_BASE (ctor),
|
||||
complete_ctor_identifier,
|
||||
FUNCTION_FIRST_USER_PARMTYPE (ctor),
|
||||
LOOKUP_NORMAL|LOOKUP_SPECULATIVE,
|
||||
tf_none);
|
||||
pop_deferring_access_checks ();
|
||||
if (fn == error_mark_node)
|
||||
return NULL_TREE;
|
||||
return fn;
|
||||
}
|
||||
|
||||
/* Subroutine of synthesized_method_walk. Update SPEC_P, TRIVIAL_P and
|
||||
DELETED_P or give an error message MSG with argument ARG. */
|
||||
|
||||
|
|
|
@ -7438,19 +7438,31 @@ retrieve_constexpr_fundef (tree fun)
|
|||
static bool
|
||||
is_valid_constexpr_fn (tree fun, bool complain)
|
||||
{
|
||||
tree parm = FUNCTION_FIRST_USER_PARM (fun);
|
||||
bool ret = true;
|
||||
for (; parm != NULL; parm = TREE_CHAIN (parm))
|
||||
if (!literal_type_p (TREE_TYPE (parm)))
|
||||
{
|
||||
ret = false;
|
||||
if (complain)
|
||||
|
||||
if (DECL_INHERITED_CTOR_BASE (fun)
|
||||
&& TREE_CODE (fun) == TEMPLATE_DECL)
|
||||
{
|
||||
ret = false;
|
||||
if (complain)
|
||||
error ("inherited constructor %qD is not constexpr",
|
||||
get_inherited_ctor (fun));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
|
||||
parm != NULL_TREE; parm = TREE_CHAIN (parm))
|
||||
if (!literal_type_p (TREE_TYPE (parm)))
|
||||
{
|
||||
error ("invalid type for parameter %d of constexpr "
|
||||
"function %q+#D", DECL_PARM_INDEX (parm), fun);
|
||||
explain_non_literal_class (TREE_TYPE (parm));
|
||||
ret = false;
|
||||
if (complain)
|
||||
{
|
||||
error ("invalid type for parameter %d of constexpr "
|
||||
"function %q+#D", DECL_PARM_INDEX (parm), fun);
|
||||
explain_non_literal_class (TREE_TYPE (parm));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!DECL_CONSTRUCTOR_P (fun))
|
||||
{
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2014-03-11 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/60389
|
||||
* g++.dg/cpp0x/inh-ctor19.C: New.
|
||||
|
||||
2014-03-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/60429
|
||||
|
|
14
gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
Normal file
14
gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C
Normal file
|
@ -0,0 +1,14 @@
|
|||
// PR c++/60389
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct A
|
||||
{
|
||||
template<typename...T> A(T...) {}
|
||||
};
|
||||
|
||||
struct B : A
|
||||
{
|
||||
using A::A; // { dg-error "inherited" }
|
||||
};
|
||||
|
||||
constexpr B b; // { dg-error "literal" }
|
Loading…
Add table
Reference in a new issue