brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.2 KiB · 79ff93b Raw
49 lines · cpp
1namespace detail {2template <typename T> struct Quux {};3} // namespace detail4 5using FuncPtr = detail::Quux<double> (*(*)(int))(float);6 7struct Foo {8  template <typename T> void foo(T arg) const noexcept(true) {}9 10  template <int T> void operator<<(int) {}11 12  template <typename T> FuncPtr returns_func_ptr(detail::Quux<int> &&) const noexcept(false) { return nullptr; }13};14 15namespace ns {16template <typename T> int foo(char const *str) noexcept(false) { return 0; }17template <typename T> int foo(T t) { return 1; }18 19template <typename T> FuncPtr returns_func_ptr(detail::Quux<int> &&) { return nullptr; }20} // namespace ns21 22int bar() { return 1; }23 24namespace {25int anon_bar() { return 1; }26auto anon_lambda = [] {};27} // namespace28 29__attribute__((always_inline)) int inlined_foo(const char *str) {30  if (bool b = bar())31    return 1;32  return 2;33}34 35int main() {36  ns::foo<decltype(bar)>(bar);37  ns::foo<decltype(bar)>("bar");38  ns::foo(anon_lambda);39  ns::foo(anon_bar);40  ns::foo<decltype(&Foo::foo<int(int)>)>("method");41  ns::returns_func_ptr<int>(detail::Quux<int>{});42  Foo f;43  f.foo(anon_bar);44  f.operator<< <(2 > 1)>(0);45  f.returns_func_ptr<int>(detail::Quux<int>{});46  inlined_foo("bar");47  return 0;48}49