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