PR c++/83186 - ICE with static_cast of list-initialized temporary.
authorJason Merrill <jason@redhat.com>
Fri, 12 Jan 2018 19:40:11 +0000 (14:40 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 12 Jan 2018 19:40:11 +0000 (14:40 -0500)
* typeck.c (build_static_cast): Use build_non_dependent_expr.

From-SVN: r256594

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/initlist-cast1.C [new file with mode: 0644]

index c1558040baa216febcdf1922363166d2959f64b8..533e2d34e4350b65381a16fd1e01053778b88f96 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-12  Jason Merrill  <jason@redhat.com>
+
+       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  <nathan@acm.org>
 
        * cp-tree.h (mark_rvalue_use): Add parm name.
index 669a2b45bfdddcfdfff11979a9396bf971e046ff..f0dc03de11120cea3f44fbf172550dba11e397d0 100644 (file)
@@ -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 (file)
index 0000000..5446d85
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/83186
+// { dg-do compile { target c++11 } }
+
+struct a {
+  operator unsigned();
+};
+template <class> void b() { static_cast<unsigned>(a{}); }
+
+int main()
+{
+  b<int>();
+}