diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C | 35 |
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; +} |