c++: Fix paren init of aggregates in unevaluated context [PR92947]
authorMarek Polacek <polacek@redhat.com>
Fri, 7 Feb 2020 19:44:25 +0000 (14:44 -0500)
committerMarek Polacek <polacek@redhat.com>
Fri, 7 Feb 2020 21:59:09 +0000 (16:59 -0500)
commitac6eaa55a5199196ea0a25763114ce05333a14d3
tree26e3cee974415a5d8695ad18be4519f3824a0522
parent8496e135b111424e3c84f3f44c74f2cbe48eed90
c++: Fix paren init of aggregates in unevaluated context [PR92947]

When I implemented C++20 parenthesized initialization of aggregates
I introduced this bogus cp_unevaluated_operand check, thus disabling
this feature in unevaluated context.  Oop.

Removing the check turned up another bug: I wasn't checking the
return value of digest_init.  So when constructible_expr called
build_new_method_call_1 to see if we can construct one type from
another, it got back a bogus INIT_EXPR that looked something like
*(struct T &) 1 = <<< error >>>.  But that isn't the error_mark_node,
so constructible_expr thought we had been successful in creating the
ctor call, and it gave the wrong answer.  Covered by paren-init17.C.

PR c++/92947 - Paren init of aggregates in unevaluated context.
* call.c (build_new_method_call_1): Don't check
cp_unevaluated_operand.  Check the return value of digest_init.

* g++.dg/cpp2a/paren-init21.C: New test.
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/paren-init21.C [new file with mode: 0644]