Commit 8d2318ff by Paolo Carlini Committed by Paolo Carlini

re PR c++/89914 (ICE in nothrow_spec_p, at cp/except.c:1238)

/cp
2019-04-08  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/89914
	* semantics.c (trait_expr_value): Don't use TYPE_NOTHROW_P
	when maybe_instantiate_noexcept fails.
	(classtype_has_nothrow_assign_or_copy_p): Likewise.
	* method.c (implicitly_declare_fn): Avoid passing error_mark_node
	to build_exception_variant.

/testsuite
2019-04-08  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/89914
	* g++.dg/ext/has_nothrow_constructor-3.C: New.

From-SVN: r270201
parent 66d8ee9c
2019-04-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/89914
* semantics.c (trait_expr_value): Don't use TYPE_NOTHROW_P
when maybe_instantiate_noexcept fails.
(classtype_has_nothrow_assign_or_copy_p): Likewise.
* method.c (implicitly_declare_fn): Avoid passing error_mark_node
to build_exception_variant.
2019-04-05 Marek Polacek <polacek@redhat.com> 2019-04-05 Marek Polacek <polacek@redhat.com>
PR c++/87145 - bogus error converting class type in template arg list. PR c++/87145 - bogus error converting class type in template arg list.
......
...@@ -2061,7 +2061,14 @@ implicitly_declare_fn (special_function_kind kind, tree type, ...@@ -2061,7 +2061,14 @@ implicitly_declare_fn (special_function_kind kind, tree type,
/* Create the function. */ /* Create the function. */
fn_type = build_method_type_directly (type, return_type, parameter_types); fn_type = build_method_type_directly (type, return_type, parameter_types);
if (raises) if (raises)
fn_type = build_exception_variant (fn_type, raises); {
if (raises != error_mark_node)
fn_type = build_exception_variant (fn_type, raises);
else
/* Can happen, eg, in C++98 mode for an ill-formed non-static data
member initializer (c++/89914). */
gcc_assert (seen_error ());
}
fn = build_lang_decl (FUNCTION_DECL, name, fn_type); fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
if (kind != sfk_inheriting_constructor) if (kind != sfk_inheriting_constructor)
DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type)); DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
......
...@@ -9551,8 +9551,8 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p) ...@@ -9551,8 +9551,8 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
if (copy_fn_p (fn) > 0) if (copy_fn_p (fn) > 0)
{ {
saw_copy = true; saw_copy = true;
maybe_instantiate_noexcept (fn); if (!maybe_instantiate_noexcept (fn)
if (!TYPE_NOTHROW_P (TREE_TYPE (fn))) || !TYPE_NOTHROW_P (TREE_TYPE (fn)))
return false; return false;
} }
} }
...@@ -9594,8 +9594,8 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) ...@@ -9594,8 +9594,8 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
return (trait_expr_value (CPTK_HAS_TRIVIAL_CONSTRUCTOR, type1, type2) return (trait_expr_value (CPTK_HAS_TRIVIAL_CONSTRUCTOR, type1, type2)
|| (CLASS_TYPE_P (type1) || (CLASS_TYPE_P (type1)
&& (t = locate_ctor (type1)) && (t = locate_ctor (type1))
&& (maybe_instantiate_noexcept (t), && maybe_instantiate_noexcept (t)
TYPE_NOTHROW_P (TREE_TYPE (t))))); && TYPE_NOTHROW_P (TREE_TYPE (t))));
case CPTK_HAS_TRIVIAL_CONSTRUCTOR: case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
type1 = strip_array_types (type1); type1 = strip_array_types (type1);
......
2019-04-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/89914
* g++.dg/ext/has_nothrow_constructor-3.C: New.
2019-04-07 Uroš Bizjak <ubizjak@gmail.com> 2019-04-07 Uroš Bizjak <ubizjak@gmail.com>
PR target/89945 PR target/89945
......
// PR c++/89914
struct A
{
int i = ; // { dg-error "expected" }
// { dg-error "non-static data member" "" { target c++98_only } .-1 }
};
bool b = __has_nothrow_constructor (A);
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