Commit 3fd156b1 by Alexandre Oliva Committed by Alexandre Oliva

[PR c++/87814] undefer deferred noexcept on tsubst if request

tsubst_expr and tsubst_copy_and_build are not expected to handle
DEFERRED_NOEXCEPT exprs, but if tsubst_exception_specification takes a
DEFERRED_NOEXCEPT expr with !defer_ok, it just passes the expr on for
tsubst_copy_and_build to barf.

This patch arranges for tsubst_exception_specification to combine the
incoming args with those already stored in a DEFERRED_NOEXCEPT, and
then substitute them into the pattern, when retaining a deferred
noexcept is unacceptable.


for  gcc/cp/ChangeLog

	PR c++/87814
	* pt.c (tsubst_exception_specification): Handle
	DEFERRED_NOEXCEPT with !defer_ok.

for  gcc/testsuite/ChangeLog

	PR c++/87814
	* g++.dg/cpp1z/pr87814.C: New.

From-SVN: r267155
parent 06553c89
2018-12-14 Alexandre Oliva <aoliva@redhat.com>
PR c++/87814
* pt.c (tsubst_exception_specification): Handle
DEFERRED_NOEXCEPT with !defer_ok.
2018-12-14 Jason Merrill <jason@redhat.com>
PR c++/86823
......
......@@ -14151,9 +14151,17 @@ tsubst_exception_specification (tree fntype,
}
}
else
new_specs = tsubst_copy_and_build
(expr, args, complain, in_decl, /*function_p=*/false,
/*integral_constant_expression_p=*/true);
{
if (DEFERRED_NOEXCEPT_SPEC_P (specs))
{
args = add_to_template_args (DEFERRED_NOEXCEPT_ARGS (expr),
args);
expr = DEFERRED_NOEXCEPT_PATTERN (expr);
}
new_specs = tsubst_copy_and_build
(expr, args, complain, in_decl, /*function_p=*/false,
/*integral_constant_expression_p=*/true);
}
new_specs = build_noexcept_spec (new_specs, complain);
}
else if (specs)
......
2018-12-14 Alexandre Oliva <aoliva@redhat.com>
PR c++/87814
* g++.dg/cpp1z/pr87814.C: New.
2018-12-14 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/cf_check-1.c: New test.
......
// { dg-do compile { target c++17 } }
template<class Element>
struct box {
template<class E>
constexpr box(E && e)
noexcept(noexcept(Element(e)))
{}
};
template<class... Ts>
struct compressed_tuple_ : box<Ts> ... {
template<typename... Args>
constexpr compressed_tuple_(Args &&... args)
noexcept((noexcept(box<Ts>(args)) && ...))
: box<Ts>(args)...
{}
};
struct adaptor_cursor : compressed_tuple_<int*> {
using compressed_tuple_::compressed_tuple_;
};
int main() {
(void)noexcept(adaptor_cursor{(int*)0});
}
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