From: Paolo Carlini Date: Mon, 8 Apr 2019 08:13:50 +0000 (+0000) Subject: re PR c++/89914 (ICE in nothrow_spec_p, at cp/except.c:1238) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8d2318ffa323564735c39a4de251df2dfcceb346;p=gcc.git re PR c++/89914 (ICE in nothrow_spec_p, at cp/except.c:1238) /cp 2019-04-08 Paolo Carlini 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 PR c++/89914 * g++.dg/ext/has_nothrow_constructor-3.C: New. From-SVN: r270201 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f766f476f10..74e2b7d95c6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2019-04-08 Paolo Carlini + + 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 PR c++/87145 - bogus error converting class type in template arg list. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index da9600cd143..03eea408a8f 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -2061,7 +2061,14 @@ implicitly_declare_fn (special_function_kind kind, tree type, /* Create the function. */ fn_type = build_method_type_directly (type, return_type, parameter_types); 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); if (kind != sfk_inheriting_constructor) DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type)); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 408675b8099..3ae9cf050fb 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9551,8 +9551,8 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p) if (copy_fn_p (fn) > 0) { saw_copy = true; - maybe_instantiate_noexcept (fn); - if (!TYPE_NOTHROW_P (TREE_TYPE (fn))) + if (!maybe_instantiate_noexcept (fn) + || !TYPE_NOTHROW_P (TREE_TYPE (fn))) return false; } } @@ -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) || (CLASS_TYPE_P (type1) && (t = locate_ctor (type1)) - && (maybe_instantiate_noexcept (t), - TYPE_NOTHROW_P (TREE_TYPE (t))))); + && maybe_instantiate_noexcept (t) + && TYPE_NOTHROW_P (TREE_TYPE (t)))); case CPTK_HAS_TRIVIAL_CONSTRUCTOR: type1 = strip_array_types (type1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf3f0d4afa2..6bcc177ccf6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-08 Paolo Carlini + + PR c++/89914 + * g++.dg/ext/has_nothrow_constructor-3.C: New. + 2019-04-07 Uroš Bizjak PR target/89945 diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-3.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-3.C new file mode 100644 index 00000000000..6306d72315b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-3.C @@ -0,0 +1,9 @@ +// 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);