From: Jason Merrill Date: Fri, 12 Jan 2018 19:40:11 +0000 (-0500) Subject: PR c++/83186 - ICE with static_cast of list-initialized temporary. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=abdca01e866a9471d43a7b21980b71ba9657a1fe;p=gcc.git PR c++/83186 - ICE with static_cast of list-initialized temporary. * typeck.c (build_static_cast): Use build_non_dependent_expr. From-SVN: r256594 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c1558040baa..533e2d34e43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-01-12 Jason Merrill + + PR c++/83186 - ICE with static_cast of list-initialized temporary. + * typeck.c (build_static_cast): Use build_non_dependent_expr. + 2018-01-12 Nathan Sidwell * cp-tree.h (mark_rvalue_use): Add parm name. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 669a2b45bfd..f0dc03de111 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -7204,6 +7204,8 @@ build_static_cast (tree type, tree oexpr, tsubst_flags_t complain) TREE_SIDE_EFFECTS (expr) = 1; return convert_from_reference (expr); } + else if (processing_template_decl) + expr = build_non_dependent_expr (expr); /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-cast1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-cast1.C new file mode 100644 index 00000000000..5446d85f3aa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-cast1.C @@ -0,0 +1,12 @@ +// PR c++/83186 +// { dg-do compile { target c++11 } } + +struct a { + operator unsigned(); +}; +template void b() { static_cast(a{}); } + +int main() +{ + b(); +}