aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-23 08:46:05 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-23 08:46:05 +0100
commit2e73a89bc9a73ef83b7b87fb65b8293c0ae8b693 (patch)
treea57d36153388b50d5bdc27beb742519a3a6836b2 /gcc
parent38ad6f8a440f7594b9cea5fb999078035ee36a57 (diff)
downloadgcc-2e73a89bc9a73ef83b7b87fb65b8293c0ae8b693.zip
gcc-2e73a89bc9a73ef83b7b87fb65b8293c0ae8b693.tar.gz
gcc-2e73a89bc9a73ef83b7b87fb65b8293c0ae8b693.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/pr83918.C32
-rw-r--r--gcc/tree.c6
4 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 507bb52..a1307e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 82497ed..d22af7a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
PR tree-optimization/83957
diff --git a/gcc/testsuite/g++.dg/cpp1z/pr83918.C b/gcc/testsuite/g++.dg/cpp1z/pr83918.C
new file mode 100644
index 0000000..d4fe826
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/pr83918.C
@@ -0,0 +1,32 @@
+// 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));
diff --git a/gcc/tree.c b/gcc/tree.c
index b3e93b8..452d385 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -14085,8 +14085,10 @@ maybe_wrap_with_location (tree expr, location_t loc)
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;