From: Paolo Carlini Date: Tue, 11 Mar 2014 17:34:32 +0000 (+0000) Subject: re PR c++/60389 ([c++11] ICE with inheriting constructors and wrong usage of constexpr) X-Git-Tag: releases/gcc-4.9.0~493 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5af1876c657286423edbf631be14a36ce2dcaeaa;p=thirdparty%2Fgcc.git re PR c++/60389 ([c++11] ICE with inheriting constructors and wrong usage of constexpr) /cp 2014-03-11 Paolo Carlini 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 PR c++/60389 * g++.dg/cpp0x/inh-ctor19.C: New. From-SVN: r208491 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4aa90ee40086..4848b54223ff 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-03-11 Paolo Carlini + + 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 PR c++/60367 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 45e4d8217460..e9fe86ee4cd1 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/method.c b/gcc/cp/method.c index c3940f2d9b4e..d72b564a4640 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -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. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fcd840956572..1c9e153e3e32 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 241f61961336..a3503424ee53 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-03-11 Paolo Carlini + + PR c++/60389 + * g++.dg/cpp0x/inh-ctor19.C: New. + 2014-03-11 Richard Biener PR tree-optimization/60429 diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C new file mode 100644 index 000000000000..7a22f8830ecd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C @@ -0,0 +1,14 @@ +// PR c++/60389 +// { dg-do compile { target c++11 } } + +struct A +{ + template A(T...) {} +}; + +struct B : A +{ + using A::A; // { dg-error "inherited" } +}; + +constexpr B b; // { dg-error "literal" }