From 1e8aa132091239672d24baa01e571a06cf4d4c66 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Tue, 2 Jul 2019 00:23:41 +0000 Subject: [PATCH] PR c++/90490 - fix decltype issues in noexcept-specifier. * except.c (build_noexcept_spec): Call instantiate_non_dependent_expr_sfinae before build_converted_constant_expr instead of calling instantiate_non_dependent_expr after it. Add processing_template_decl_sentinel. * g++.dg/cpp0x/noexcept43.C: New test. * g++.dg/cpp0x/noexcept44.C: New test. From-SVN: r272918 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/except.c | 4 +++- gcc/testsuite/g++.dg/cpp0x/noexcept43.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp0x/noexcept44.C | 8 ++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept43.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/noexcept44.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 50e187be21a9..6d2f73106bae 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -6,6 +6,13 @@ PR c++/60223 - ICE with T{} in non-deduced context. * pt.c (unify): Allow COMPOUND_LITERAL_P in a non-deduced context. + PR c++/90490 - fix decltype issues in noexcept-specifier. + * except.c (build_noexcept_spec): Call + instantiate_non_dependent_expr_sfinae before + build_converted_constant_expr instead of calling + instantiate_non_dependent_expr after it. Add + processing_template_decl_sentinel. + 2019-06-29 Jakub Jelinek Backported from mainline diff --git a/gcc/cp/except.c b/gcc/cp/except.c index afc261073d73..03a9c8e53c74 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -1288,8 +1288,10 @@ build_noexcept_spec (tree expr, tsubst_flags_t complain) if (TREE_CODE (expr) != DEFERRED_NOEXCEPT && !value_dependent_expression_p (expr)) { + expr = instantiate_non_dependent_expr_sfinae (expr, complain); + /* Don't let convert_like_real create more template codes. */ + processing_template_decl_sentinel s; expr = build_converted_constant_bool_expr (expr, complain); - expr = instantiate_non_dependent_expr (expr); expr = cxx_constant_value (expr); } if (TREE_CODE (expr) == INTEGER_CST) diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept43.C b/gcc/testsuite/g++.dg/cpp0x/noexcept43.C new file mode 100644 index 000000000000..faa7d146029c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept43.C @@ -0,0 +1,10 @@ +// PR c++/90490 +// { dg-do compile { target c++11 } } + +struct R { constexpr operator bool() { return false;} }; + +template +struct S { + void g() noexcept(decltype(R{ }) { }) { + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept44.C b/gcc/testsuite/g++.dg/cpp0x/noexcept44.C new file mode 100644 index 000000000000..78c9d12f2b71 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept44.C @@ -0,0 +1,8 @@ +// PR c++/90490 +// { dg-do compile { target c++11 } } + +template +struct S { + void g() noexcept(decltype(int{ }) { }) { + } +}; -- 2.47.2