aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-01-09 00:12:03 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-01-09 00:12:03 -0500
commitfe71aa4ea5d17256d6f0343fbd730a66eddd1e92 (patch)
tree359b47855f934495611d898ba25a3f1b9d21d4b8
parent10909139018018853fb7e21dd3d1c54902dd0bb0 (diff)
downloadgcc-fe71aa4ea5d17256d6f0343fbd730a66eddd1e92.zip
gcc-fe71aa4ea5d17256d6f0343fbd730a66eddd1e92.tar.gz
gcc-fe71aa4ea5d17256d6f0343fbd730a66eddd1e92.tar.bz2
re PR c++/69158 (ICE in in cxx_eval_indirect_ref, at cp/constexpr.c:2598)
PR c++/69158 * constexpr.c (cxx_fold_indirect_ref): Handle array type differing in completion. From-SVN: r232186
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c10
-rw-r--r--gcc/testsuite/g++.dg/init/array40.C2
3 files changed, 17 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 49dc0cf..8723cad 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-08 Jason Merrill <jason@redhat.com>
+
+ PR c++/69158
+ * constexpr.c (cxx_fold_indirect_ref): Handle array type differing
+ in completion.
+
2016-01-08 Marek Polacek <polacek@redhat.com>
PR c++/68449
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 7b60271..e60180e 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -2382,7 +2382,15 @@ cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
if (TREE_CODE (op) == CONST_DECL)
return DECL_INITIAL (op);
/* *&p => p; make sure to handle *&"str"[cst] here. */
- if (same_type_ignoring_top_level_qualifiers_p (optype, type))
+ if (same_type_ignoring_top_level_qualifiers_p (optype, type)
+ /* Also handle the case where the desired type is an array of unknown
+ bounds because the variable has had its bounds deduced since the
+ ADDR_EXPR was created. */
+ || (TREE_CODE (type) == ARRAY_TYPE
+ && TREE_CODE (optype) == ARRAY_TYPE
+ && TYPE_DOMAIN (type) == NULL_TREE
+ && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (optype),
+ TREE_TYPE (type))))
{
tree fop = fold_read_from_constant_string (op);
if (fop)
diff --git a/gcc/testsuite/g++.dg/init/array40.C b/gcc/testsuite/g++.dg/init/array40.C
new file mode 100644
index 0000000..5c976e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/array40.C
@@ -0,0 +1,2 @@
+// PR c++/69158
+char IdHdr[] = { (IdHdr)[0] };