diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-01-23 08:46:05 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-01-23 08:46:05 +0100 |
commit | 2e73a89bc9a73ef83b7b87fb65b8293c0ae8b693 (patch) | |
tree | a57d36153388b50d5bdc27beb742519a3a6836b2 /gcc | |
parent | 38ad6f8a440f7594b9cea5fb999078035ee36a57 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/pr83918.C | 32 | ||||
-rw-r--r-- | gcc/tree.c | 6 |
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)); @@ -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; |