1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++11 %s -verify
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-no-diagnostics
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing size_t = decltype(sizeof(0));
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<typename T> struct check;
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<size_t N> struct check<const char[N]> {};
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconstexpr bool startswith(const char *p, const char *q) {
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return !*q || (*p == *q && startswith(p + 1, q + 1));
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconstexpr bool contains(const char *p, const char *q) {
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return *p && (startswith(p, q) || contains(p + 1, q));
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid foo() {
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  check<decltype(__func__)>();
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static_assert(contains(__func__, "foo"), "");
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
19