target.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//===----------------------------------------------------------------------===//
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//                     The LLVM Compiler Infrastructure
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// This file is dual licensed under the MIT and the University of Illinois Open
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Source Licenses. See LICENSE.TXT for details.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//===----------------------------------------------------------------------===//
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// <functional>
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// class function<R(ArgTypes...)>
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// template<typename T>
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   T*
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   target();
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// template<typename T>
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   const T*
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//   target() const;
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <functional>
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <new>
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cstdlib>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cassert>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass A
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int data_[10];
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectpublic:
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static int count;
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    A()
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ++count;
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (int i = 0; i < 10; ++i)
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_[i] = i;
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    A(const A&) {++count;}
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ~A() {--count;}
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int operator()(int i) const
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (int j = 0; j < 10; ++j)
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            i += data_[j];
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return i;
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int foo(int) const {return 1;}
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint A::count = 0;
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint g(int) {return 0;}
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint main()
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    std::function<int(int)> f = A();
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 1);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<A>());
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<int(*)(int)>() == 0);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    std::function<int(int)> f = g;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<int(*)(int)>());
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<A>() == 0);
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const std::function<int(int)> f = A();
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 1);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<A>());
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<int(*)(int)>() == 0);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const std::function<int(int)> f = g;
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<int(*)(int)>());
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(f.target<A>() == 0);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    assert(A::count == 0);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project