c++: undiagnosed error_mark_node from cp_build_c_cast [PR112658]
When cp_build_c_cast commits to an erroneous const_cast, we neglect to replay errors from build_const_cast_1 which can lead to us incorrectly accepting (and "miscompiling") the cast, or triggering the assert in finish_expr_stmt. This patch fixes this oversight. This was the original fix for the ICE in PR112658 before r14-5941-g305a2686c99bf9 made us accept the testcase there after all. I wasn't able to come up with an alternate testcase for which this fix has an effect anymore, but below is a reduced version of the PR112658 testcase (accepted ever since r14-5941) for good measure. PR c++/112658 PR c++/94264 gcc/cp/ChangeLog: * typeck.cc (cp_build_c_cast): If we're committed to a const_cast and the result is erroneous, call build_const_cast_1 a second time to issue errors. Use complain=tf_none instead of =false. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-array20.C: New test.
This commit is contained in:
parent
d468718c9a
commit
5764825aed
2 changed files with 14 additions and 1 deletions
|
@ -9213,6 +9213,8 @@ cp_build_c_cast (location_t loc, tree type, tree expr,
|
|||
maybe_warn_about_useless_cast (loc, type, value, complain);
|
||||
maybe_warn_about_cast_ignoring_quals (loc, type, complain);
|
||||
}
|
||||
else if (complain & tf_error)
|
||||
build_const_cast_1 (loc, type, value, tf_error, &valid_p);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -9248,7 +9250,7 @@ cp_build_c_cast (location_t loc, tree type, tree expr,
|
|||
to succeed. */
|
||||
if (!same_type_p (non_reference (type), non_reference (result_type)))
|
||||
{
|
||||
result = build_const_cast_1 (loc, type, result, false, &valid_p);
|
||||
result = build_const_cast_1 (loc, type, result, tf_none, &valid_p);
|
||||
gcc_assert (valid_p);
|
||||
}
|
||||
return result;
|
||||
|
|
11
gcc/testsuite/g++.dg/cpp0x/initlist-array20.C
Normal file
11
gcc/testsuite/g++.dg/cpp0x/initlist-array20.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/112658
|
||||
// PR c++/94264
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
void f(int*);
|
||||
|
||||
int main() {
|
||||
using array = int[];
|
||||
f(array{42});
|
||||
f((int*)array{42});
|
||||
}
|
Loading…
Add table
Reference in a new issue