diff options
Diffstat (limited to 'debian/patches/pr78774.diff')
-rw-r--r-- | debian/patches/pr78774.diff | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/debian/patches/pr78774.diff b/debian/patches/pr78774.diff new file mode 100644 index 0000000..edbf219 --- /dev/null +++ b/debian/patches/pr78774.diff @@ -0,0 +1,48 @@ +# DP: Fix PR c++/78774, proposed for the gcc-6-branch + +PR c++/78774 - [6/7 Regression] ICE in constexpr string literals and templates + +gcc/cp/ChangeLog: + + PR c++/78774 + * pt.c (convert_template_argument): Avoid assuming operand type + is non-null since that of SCOPE_REF is not. + +gcc/testsuite/ChangeLog: + + PR c++/78774 + * g++.dg/cpp1y/pr78774.C: New test. + +Index: b/src/gcc/cp/pt.c +=================================================================== +--- a/src/gcc/cp/pt.c ++++ b/src/gcc/cp/pt.c +@@ -7281,9 +7281,11 @@ convert_template_argument (tree parm, + /* Reject template arguments that are references to built-in + functions with no library fallbacks. */ + const_tree inner = TREE_OPERAND (val, 0); +- if (TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE +- && TREE_CODE (TREE_TYPE (TREE_TYPE (inner))) == FUNCTION_TYPE +- && TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE ++ const_tree innertype = TREE_TYPE (inner); ++ if (innertype ++ && TREE_CODE (innertype) == REFERENCE_TYPE ++ && TREE_CODE (TREE_TYPE (innertype)) == FUNCTION_TYPE ++ && TREE_CODE (innertype) == REFERENCE_TYPE + && 0 < TREE_OPERAND_LENGTH (inner) + && reject_gcc_builtin (TREE_OPERAND (inner, 0))) + return error_mark_node; +Index: b/src/gcc/testsuite/g++.dg/cpp1y/pr78774.C +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/g++.dg/cpp1y/pr78774.C +@@ -0,0 +1,9 @@ ++// PR c++/78774 - [6/7 Regression] ICE in constexpr string literals and ++// templates ++// { dg-do compile { target c++14 } } ++ ++template <int> struct ops { ++ template <int> struct A; ++ template <int *Ptr> using explode = typename A<*Ptr>::join; ++}; ++template <typename Ts> typename ops<'\0'>::explode<Ts::join>::type a; |