aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C35
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C
new file mode 100644
index 00000000000..cf32938ecc0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C
@@ -0,0 +1,35 @@
+// PR c++/69315
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2" }
+
+// Template instantiation and evaluation for folding within
+// finish_function may call finish_function recursively.
+// Make sure we don't reject or delay that sort of recursion.
+
+template <bool> struct Iter;
+
+struct Arg {
+ Iter<true> begin();
+ Iter<true> end();
+};
+
+template <bool> struct Iter {
+ int operator*();
+ Iter operator++();
+ template <bool C1, bool C2> friend constexpr bool operator==(Iter<C1>, Iter<C2>);
+ template <bool C1, bool C2> friend constexpr bool operator!=(Iter<C1>, Iter<C2>);
+};
+
+void func(Arg a) {
+ for (auto ch : a) {
+ a.begin() == a.end();
+ }
+}
+
+template <bool C1, bool C2> constexpr bool operator==(Iter<C1>, Iter<C2>) {
+ return true;
+}
+
+template <bool C1, bool C2> constexpr bool operator!=(Iter<C1> a, Iter<C2> b) {
+ return a == b;
+}