diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/pr53792.C')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr53792.C | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr53792.C b/gcc/testsuite/g++.dg/cpp0x/pr53792.C new file mode 100644 index 00000000000..deb5c1abd8b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr53792.C @@ -0,0 +1,29 @@ +// PR c++/53792 +// { dg-do compile { target c++11 } } +// { dg-options "-O2 -fdump-tree-optimized" } +// { dg-final { scan-tree-dump "return 0" "optimized" } } + +struct entry { + char const* label; + int value; +}; + +constexpr bool same(char const *x, char const *y) { + return !*x && !*y ? true + : /* default */ (*x == *y && same(x+1, y+1)); +} + +constexpr int keyToValue(char const *label, entry const *entries) { + return !entries->label ? entries->value + : same(entries->label, label) ? entries->value + : /*default*/ keyToValue(label, entries+1); +} + +constexpr entry foo[] = {{"Foo", 0}, {"Bar", 1}, {"FooBar", 2}, {0, -1}}; + +int +bar() +{ + int result = keyToValue("Foo", foo); + return result; +} |