+2018-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/83918
+ * tree.c (maybe_wrap_with_location): Use NON_LVALUE_EXPR rather than
+ VIEW_CONVERT_EXPR to wrap CONST_DECLs.
+
2018-01-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/83957
--- /dev/null
+// PR c++/83918
+// { dg-do compile }
+// { dg-options "-std=c++17" }
+
+constexpr unsigned
+foo (unsigned x, unsigned y)
+{
+ return x > y ? x : y;
+}
+
+template <typename, typename> struct A;
+template <auto ...> struct B;
+template <auto S, auto ... T, auto U, auto ... V>
+struct A <B <S, T...>, B <U, V...>>
+{
+ enum : unsigned
+ {
+ u = foo (sizeof (S), sizeof (U)),
+ v = A <B <T...>, B <V...>>::w,
+ w = foo (u, v)
+ };
+};
+
+template <>
+struct A <B <>, B <>>
+{
+ enum : unsigned { w = 0 };
+};
+
+constexpr static const auto v { A <B <1,2,3,4,5,6,7,8,9>,
+ B <9,8,7,6,5,4,3,2,1>>::w };
+static_assert (v == sizeof (int));
if (EXCEPTIONAL_CLASS_P (expr))
return expr;
- tree_code code = (CONSTANT_CLASS_P (expr) && TREE_CODE (expr) != STRING_CST
- ? NON_LVALUE_EXPR : VIEW_CONVERT_EXPR);
+ tree_code code
+ = (((CONSTANT_CLASS_P (expr) && TREE_CODE (expr) != STRING_CST)
+ || (TREE_CODE (expr) == CONST_DECL && !TREE_STATIC (expr)))
+ ? NON_LVALUE_EXPR : VIEW_CONVERT_EXPR);
tree wrapper = build1_loc (loc, code, TREE_TYPE (expr), expr);
/* Mark this node as being a wrapper. */
EXPR_LOCATION_WRAPPER_P (wrapper) = 1;