Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/16?
-- >8 --
Here r16-3466 moved the canonicalization step that transforms
idx[array] to array[idx] to the beginning of cp_build_array_ref.
When we have array[array], we'll be swapping till we blow the stack.
Previously, we'd give the !INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P
error so there was no problem.
PR c++/125454
gcc/cp/ChangeLog:
* typeck.cc (cp_build_array_ref): Don't recurse for array[array].
gcc/testsuite/ChangeLog:
* g++.dg/other/array8.C: New test.
---
gcc/cp/typeck.cc | 3 ++-
gcc/testsuite/g++.dg/other/array8.C | 15 +++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/other/array8.C
diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 483e664397b..37a0c3cfb7a 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -4162,7 +4162,8 @@ cp_build_array_ref (location_t loc, tree array, tree idx,
return error_mark_node;
/* 0[array] */
- if (TREE_CODE (TREE_TYPE (idx)) == ARRAY_TYPE)
+ if (TREE_CODE (TREE_TYPE (idx)) == ARRAY_TYPE
+ && TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE)
{
std::swap (array, idx);
diff --git a/gcc/testsuite/g++.dg/other/array8.C
b/gcc/testsuite/g++.dg/other/array8.C
new file mode 100644
index 00000000000..d238e3ba589
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/array8.C
@@ -0,0 +1,15 @@
+// PR c++/125454
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+void
+foo()
+{
+ T a = a[a]; // { dg-error "array subscript is not an integer" }
+}
+
+void
+bar ()
+{
+ foo<int[]>;
+}
base-commit: 51a122bf9bf8f01ddfd53fe9e527e93b2ef99ffb
--
2.54.0