Commit 2e73a89b by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/83918 ([c++17] ICE on constexpr eval of datatype involving function…

re PR c++/83918 ([c++17] ICE on constexpr eval of datatype involving function and variadic template)

	PR c++/83918
	* tree.c (maybe_wrap_with_location): Use NON_LVALUE_EXPR rather than
	VIEW_CONVERT_EXPR to wrap CONST_DECLs.

	* g++.dg/cpp1z/pr83918.C: New test.

From-SVN: r256972
parent 38ad6f8a
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> 2018-01-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/83957 PR tree-optimization/83957
......
2018-01-23 Jakub Jelinek <jakub@redhat.com>
PR c++/83918
* g++.dg/cpp1z/pr83918.C: New test.
2018-01-22 Jakub Jelinek <jakub@redhat.com> 2018-01-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/83957 PR tree-optimization/83957
......
// 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));
...@@ -14085,8 +14085,10 @@ maybe_wrap_with_location (tree expr, location_t loc) ...@@ -14085,8 +14085,10 @@ maybe_wrap_with_location (tree expr, location_t loc)
if (EXCEPTIONAL_CLASS_P (expr)) if (EXCEPTIONAL_CLASS_P (expr))
return expr; return expr;
tree_code code = (CONSTANT_CLASS_P (expr) && TREE_CODE (expr) != STRING_CST tree_code code
? NON_LVALUE_EXPR : VIEW_CONVERT_EXPR); = (((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); tree wrapper = build1_loc (loc, code, TREE_TYPE (expr), expr);
/* Mark this node as being a wrapper. */ /* Mark this node as being a wrapper. */
EXPR_LOCATION_WRAPPER_P (wrapper) = 1; EXPR_LOCATION_WRAPPER_P (wrapper) = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment