diff options
Diffstat (limited to 'test/SemaTemplate/instantiate-local-class.cpp')
-rw-r--r-- | test/SemaTemplate/instantiate-local-class.cpp | 117 |
1 files changed, 116 insertions, 1 deletions
diff --git a/test/SemaTemplate/instantiate-local-class.cpp b/test/SemaTemplate/instantiate-local-class.cpp index c151fbb..2bf24c2 100644 --- a/test/SemaTemplate/instantiate-local-class.cpp +++ b/test/SemaTemplate/instantiate-local-class.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify %s +// RUN: %clang_cc1 -verify -std=c++11 %s // expected-no-diagnostics template<typename T> void f0() { @@ -66,3 +66,118 @@ namespace PR8801 { template void foo<Y>(); } + +namespace TemplatePacksAndLambdas { + template <typename ...T> int g(T...); + struct S { + template <typename ...T> static void f(int f = g([]{ static T t; return ++t; }()...)) {} + }; + void h() { S::f<int, int, int>(); } +} + +namespace PR9685 { + template <class Thing> void forEach(Thing t) { t.func(); } + + template <typename T> void doIt() { + struct Functor { + void func() { (void)i; } + int i; + }; + + forEach(Functor()); + } + + void call() { + doIt<int>(); + } +} + +namespace PR12702 { + struct S { + template <typename F> bool apply(F f) { return f(); } + }; + + template <typename> struct T { + void foo() { + struct F { + int x; + + bool operator()() { return x == 0; } + }; + + S().apply(F()); + } + }; + + void call() { T<int>().foo(); } +} + +namespace PR17139 { + template <class T> void foo(const T &t) { t.foo(); } + + template <class F> void bar(F *f) { + struct B { + F *fn; + void foo() const { fn(); } + } b = { f }; + foo(b); + } + + void go() {} + + void test() { bar(go); } +} + +namespace PR17740 { +class C { +public: + template <typename T> static void foo(T function); + template <typename T> static void bar(T function); + template <typename T> static void func(T function); +}; + +template <typename T> void C::foo(T function) { function(); } + +template <typename T> void C::bar(T function) { + foo([&function]() { function(); }); +} + +template <typename T> void C::func(T function) { + struct Struct { + T mFunction; + + Struct(T function) : mFunction(function) {}; + + void operator()() { + mFunction(); + }; + }; + + bar(Struct(function)); +} + +void call() { + C::func([]() {}); +} +} + +namespace PR14373 { + struct function { + template <typename _Functor> function(_Functor __f) { __f(); } + }; + template <typename Func> function exec_func(Func f) { + struct functor { + functor(Func f) : func(f) {} + void operator()() const { func(); } + Func func; + }; + return functor(f); + } + struct Type { + void operator()() const {} + }; + int call() { + exec_func(Type()); + return 0; + } +} |