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