From fe71aa4ea5d17256d6f0343fbd730a66eddd1e92 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 9 Jan 2016 00:12:03 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/constexpr.c | 10 +++++++++- gcc/testsuite/g++.dg/init/array40.C | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/init/array40.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49dc0cfc5c3d..8723cad590c8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-01-08 Jason Merrill + + PR c++/69158 + * constexpr.c (cxx_fold_indirect_ref): Handle array type differing + in completion. + 2016-01-08 Marek Polacek PR c++/68449 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 7b6027138f26..e60180ee6cdc 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 000000000000..5c976e2a0bde --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array40.C @@ -0,0 +1,2 @@ +// PR c++/69158 +char IdHdr[] = { (IdHdr)[0] }; -- 2.47.2